felix@858: package de.intevation.flys.client.client.ui.chart; felix@858: felix@1436: import java.util.HashMap; felix@1436: import java.util.Map; felix@1436: import java.util.LinkedHashMap; felix@1436: felix@858: import com.google.gwt.core.client.GWT; felix@858: felix@1436: import com.google.gwt.user.client.rpc.AsyncCallback; felix@1436: felix@1436: import com.smartgwt.client.util.SC; felix@1436: felix@858: import com.smartgwt.client.types.Alignment; felix@1436: import com.smartgwt.client.types.ListGridFieldType; felix@1436: felix@858: import com.smartgwt.client.widgets.Canvas; felix@858: import com.smartgwt.client.widgets.grid.ListGrid; felix@858: import com.smartgwt.client.widgets.grid.ListGridField; felix@858: import com.smartgwt.client.widgets.grid.ListGridRecord; felix@858: import com.smartgwt.client.widgets.layout.HLayout; felix@1436: import com.smartgwt.client.widgets.layout.VLayout; felix@1444: import com.smartgwt.client.widgets.menu.events.ClickHandler; felix@1444: import com.smartgwt.client.widgets.menu.Menu; felix@1444: import com.smartgwt.client.widgets.menu.MenuItem; felix@1444: import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; felix@858: import com.smartgwt.client.widgets.form.fields.SpinnerItem; felix@858: import com.smartgwt.client.widgets.form.DynamicForm; felix@1436: felix@1436: import com.smartgwt.client.widgets.form.fields.SelectItem; felix@1436: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; felix@858: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; felix@858: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; felix@1436: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; felix@858: felix@858: import de.intevation.flys.client.client.Config; felix@858: import de.intevation.flys.client.shared.model.Artifact; felix@858: import de.intevation.flys.client.shared.model.Collection; felix@1436: import de.intevation.flys.client.shared.model.CollectionItem; felix@858: import de.intevation.flys.client.shared.model.Data; felix@858: import de.intevation.flys.client.shared.model.DefaultArtifact; felix@858: import de.intevation.flys.client.shared.model.DefaultData; felix@858: import de.intevation.flys.client.shared.model.FacetRecord; felix@1436: import de.intevation.flys.client.shared.model.OutputMode; felix@1444: import de.intevation.flys.client.shared.model.Recommendation; felix@1436: import de.intevation.flys.client.shared.model.Theme; felix@1436: import de.intevation.flys.client.shared.model.ThemeList; felix@858: felix@1444: import de.intevation.flys.client.client.services.CrossSectionKMServiceAsync; felix@1379: import de.intevation.flys.client.client.services.FeedServiceAsync; felix@1444: import de.intevation.flys.client.client.services.LoadArtifactService; felix@1444: import de.intevation.flys.client.client.services.LoadArtifactServiceAsync; felix@1444: felix@1444: felix@858: felix@858: /** felix@858: * ThemePanel much like ChartThemePanel, but shows an "Actions" column, felix@1436: * needed for interaction in the CrossSection Charts and a selctor to felix@1436: * declare which cross section profile is "master". felix@858: */ felix@858: public class CrossSectionChartThemePanel felix@858: extends ChartThemePanel { felix@1444: /** Artifact Clone/Creation service. */ felix@1444: protected LoadArtifactServiceAsync loadService = felix@1444: GWT.create(LoadArtifactService.class); felix@858: felix@1436: /** Service to query measurement points of cross sections. */ felix@1436: CrossSectionKMServiceAsync kmService = GWT.create( felix@1436: de.intevation.flys.client.client.services.CrossSectionKMService.class); felix@1436: felix@1436: /** UUID of the current "master" cross section. */ felix@1436: protected String currentMasterUUID; felix@1436: felix@1436: /** The layout (used for visual active/inactive feedback). */ felix@1436: protected VLayout layout; felix@1436: felix@858: /** felix@858: * Trivial constructor. felix@858: */ felix@858: public CrossSectionChartThemePanel( felix@1436: Collection collection, felix@1436: OutputMode mode) felix@858: { felix@858: super(collection, mode); felix@858: } felix@858: felix@858: felix@858: /** felix@1436: * Feed an artifact to let it know that it is master wrt cross-sections. felix@1436: * @param artifact uuid of an artifact. felix@1436: */ felix@1436: public void feedTellMaster(final String artifact) { felix@1436: Data[] feedData = DefaultData.createSimpleStringDataArray( felix@1436: "cross_section.master?", "1"); felix@1436: felix@1436: feedService.feed( felix@1436: Config.getInstance().getLocale(), felix@1436: new DefaultArtifact(artifact, "TODO:hash"), felix@1436: feedData, felix@1436: new AsyncCallback() { felix@1436: public void onFailure(Throwable caught) { felix@1436: GWT.log("Could not feed artifact (" + artifact felix@1436: + ") with master marker: " + caught.getMessage()); felix@1436: SC.warn(MSG.getString(caught.getMessage())); felix@1436: enable(); felix@1436: } felix@1436: public void onSuccess(Artifact artifact) { felix@1436: GWT.log("Successfully injected master mark to " + artifact); felix@1436: setCurrentMaster(artifact.getUuid()); felix@1436: requestRedraw(); felix@1436: enable(); felix@1436: } felix@1436: }); felix@1436: } felix@1436: felix@1436: felix@1436: /** felix@1444: * Tell an area artifact where to get the upper and lower curve from. felix@1445: * @param over if null, something felix@1444: */ felix@1444: public void feedTellArea(final String artifact, Theme under, Theme over) { felix@1445: felix@1445: Data[] feedData; felix@1445: felix@1445: if (over != null) { felix@1445: feedData = new Data[] { felix@1445: DefaultData.createSimpleStringData("area.curve_under", felix@1445: under.getArtifact() + under.getIndex()), felix@1445: DefaultData.createSimpleStringData("area.curve_under", felix@1445: under.getArtifact() + under.getIndex()), felix@1445: DefaultData.createSimpleStringData("area.name", felix@1445: over.getDescription() + " / " + under.getDescription()) felix@1445: }; felix@1445: } felix@1445: else { felix@1445: feedData = new Data[] { felix@1445: DefaultData.createSimpleStringData("area.curve_under", felix@1445: under.getArtifact() + under.getIndex()), felix@1445: DefaultData.createSimpleStringData("area.name", felix@1445: under.getDescription() + " / " + MSG.getString("x_axis")) felix@1445: }; felix@1445: } felix@1444: felix@1444: feedService.feed( felix@1444: Config.getInstance().getLocale(), felix@1444: new DefaultArtifact(artifact, "TODO:hash"), felix@1444: feedData, felix@1444: new AsyncCallback() { felix@1444: public void onFailure(Throwable caught) { felix@1444: GWT.log("Could not feed artifact (" + artifact felix@1444: + ") with area info: " + caught.getMessage()); felix@1444: SC.warn(MSG.getString(caught.getMessage())); felix@1444: enable(); felix@1444: } felix@1444: public void onSuccess(Artifact artifact) { felix@1444: GWT.log("Successfully set area params to " + artifact); felix@1444: requestRedraw(); felix@1445: updateCollection(); felix@1445: updateGrid(); felix@1444: enable(); felix@1444: } felix@1444: }); felix@1444: } felix@1444: felix@1444: /** felix@1438: * sets currentMasterUUID. felix@1438: */ felix@1438: public String findCurrentMaster() { felix@1438: ThemeList themeList = getThemeList(); felix@1438: int count = getThemeList().getThemeCount(); felix@1445: String firstCSUuid = null; felix@1438: for (int i = 1; i <= count; i++) { felix@1438: Theme theme = themeList.getThemeAt(i); felix@1438: String value = theme.getCollectionItem().getData().get("cross_section.master?"); felix@1438: felix@1445: if (value != null) { felix@1445: if (firstCSUuid == null) { felix@1445: firstCSUuid = theme.getArtifact(); felix@1445: } felix@1445: if (!value.equals("0")) { felix@1445: setCurrentMaster(theme.getArtifact()); felix@1445: GWT.log("found a master: " + currentMasterUUID + "/" + theme.getDescription()); felix@1445: return theme.getDescription(); felix@1445: } felix@1438: } felix@1438: } felix@1445: // There is none selected. Take the first one. felix@1445: if (firstCSUuid != null) { felix@1445: setCurrentMaster(firstCSUuid); felix@1445: feedTellMaster(firstCSUuid); felix@1445: } felix@1438: return null; felix@1438: } felix@1438: felix@1444: felix@1438: /** felix@1436: * Create Layout, add a master selection box beneath. felix@1436: */ felix@1436: @Override felix@1436: protected VLayout createLayout() { felix@1438: layout = super.createLayout(); felix@1436: felix@1436: // Create "set master" combobox. felix@1436: SelectItem cbItem = new SelectItem(); felix@1436: felix@1436: cbItem.setTitle(MSG.chart_themepanel_set_master()); felix@1436: cbItem.setType("comboBox"); felix@1436: final LinkedHashMap valueMap = felix@1436: getThemeList().toMapArtifactUUIDDescription("cross_section"); felix@1436: cbItem.setValueMap(valueMap); felix@1436: felix@1436: final DynamicForm form = new DynamicForm(); felix@1436: form.setWidth(200); felix@1436: form.setFields(cbItem); felix@1436: layout.addMember(form); felix@1436: felix@1438: Config config = Config.getInstance(); felix@1438: final String locale = config.getLocale(); felix@1438: findCurrentMaster(); felix@1438: cbItem.setValue(getCurrentMaster()); felix@1436: felix@1436: // Add Change Handler to first unset the old master and then set the felix@1436: // new master. felix@1436: cbItem.addChangeHandler(new ChangeHandler() { felix@1436: public void onChange(ChangeEvent event) { felix@1436: String selectedItem = (String) event.getValue(); felix@1436: final String artifact = selectedItem; felix@1436: felix@1436: disable(); felix@1436: felix@1436: // Tell current master that he is not master anymore. felix@1436: if (getCurrentMaster() != null) { felix@1436: Data[] feedData = DefaultData.createSimpleStringDataArray( felix@1436: "cross_section.master?", "0"); felix@1436: feedService.feed( felix@1436: locale, felix@1436: new DefaultArtifact(getCurrentMaster(), "TODO:hash"), felix@1436: feedData, felix@1436: new AsyncCallback() { felix@1436: public void onFailure(Throwable caught) { felix@1438: GWT.log("Could not un-master artifact ("+getCurrentMaster()+"): " + felix@1436: caught.getMessage()); felix@1436: SC.warn(MSG.getString(caught.getMessage())); felix@1436: enable(); felix@1436: } felix@1436: public void onSuccess(Artifact oldMaster) { felix@1436: GWT.log("Successfully un-mastered artifact."); felix@1436: feedTellMaster(artifact); felix@1436: } felix@1436: }); felix@1436: } felix@1436: else { felix@1436: feedTellMaster(artifact); felix@1436: } felix@1436: } felix@1436: }); felix@1436: felix@1436: return layout; felix@1436: } felix@1436: felix@1436: felix@1436: /** Disable the UI (becomes gray, inresponsive to user input). */ felix@1436: public void disable() { felix@1436: this.layout.setDisabled(true); felix@1436: } felix@1436: felix@1436: felix@1436: /** DisDisable the UI (becomes ungray, responsive to user input). */ felix@1436: public void enable() { felix@1436: this.layout.setDisabled(false); felix@1436: } felix@1436: felix@1436: felix@1436: /** felix@1436: * Returns a double from the list that has the smallest distance to the felix@1436: * given to value. In case of multiple values with the same difference, felix@1436: * the last one is taken. felix@1436: * @param in possible return values. felix@1436: * @param to the value to be as close to as possible. felix@1436: * @return value from in that is closest to to, -1 if none. felix@1436: */ felix@1436: public static double closest(Double[] in, double to) { felix@1436: if (in == null || in.length == 0) { felix@1436: return -1; felix@1436: } felix@1436: if (in[0] == to) { felix@1436: return to; felix@1436: } felix@1436: double minDiff = Math.abs(to - in[0]); felix@1436: double bestMatch = in[0]; felix@1436: for (int i = 1; i < in.length; i++) { felix@1436: if (in[i] == to) { felix@1436: return to; felix@1436: } felix@1436: double diff = Math.abs(to - in[0]); felix@1436: if (diff < minDiff) { felix@1436: minDiff = diff; felix@1436: bestMatch = in[i]; felix@1436: } felix@1436: } felix@1436: return bestMatch; felix@1436: } felix@1436: felix@1436: felix@1436: /** Feed a single artifact with the km of the crosssection to display. */ felix@1436: public void sendFeed(FacetRecord facetRecord, double kmD) { felix@1436: Config config = Config.getInstance(); felix@1436: final String locale = config.getLocale(); felix@1436: felix@1436: Data[] feedData = felix@1436: DefaultData.createSimpleStringDataArray("cross_section.km", felix@1436: Double.valueOf(kmD).toString()); felix@1436: felix@1436: disable(); felix@1436: feedService.feed( felix@1436: locale, felix@1436: new DefaultArtifact( felix@1436: facetRecord.getTheme().getArtifact(), felix@1436: "TODO:hash"), felix@1436: feedData, felix@1436: new AsyncCallback() { felix@1436: @Override felix@1436: public void onFailure(Throwable caught) { felix@1436: GWT.log("Could not feed artifact " + caught.getMessage()); felix@1436: SC.warn(MSG.getString(caught.getMessage())); felix@1436: enable(); felix@1436: } felix@1436: @Override felix@1436: public void onSuccess(Artifact artifact) { felix@1436: GWT.log("Successfully fed"); felix@1436: requestRedraw(); felix@1438: // TODO also feed the winfo/masterartifact? (for plot subtitle) felix@1436: enable(); felix@1436: } felix@1436: }); felix@1436: } felix@1436: felix@1436: felix@1436: /** felix@1379: * Create the handler for ChangeEvents on the Spinner in the felix@1379: * facets that control km of cross section. felix@1379: * felix@1379: * @param feedService The FeedService to send (changed) data to. felix@1379: * @param facetRecord The FacetRecord (~row in table) where this felix@1379: * handler is added to (to a child, to be exact). felix@1379: */ felix@1379: public final ChangedHandler createSpinnerHandler( felix@1379: final FeedServiceAsync feedService, felix@1379: final FacetRecord facetRecord) felix@1379: { felix@1379: Config config = Config.getInstance(); felix@1379: final String locale = config.getLocale(); felix@1379: felix@1379: ChangedHandler handler = new ChangedHandler() felix@1379: { felix@1379: @Override felix@1436: public void onChanged(final ChangedEvent ce) { felix@1379: if (ce.getValue() == null) { felix@1379: return; felix@1379: } felix@1436: felix@1436: // Now, query the value with the kmService. felix@1436: Map map = new HashMap(); felix@1436: final double selected_km = felix@1436: Double.parseDouble(ce.getValue().toString()); felix@1436: felix@1436: int _dbid = -1; felix@1436: try { felix@1436: _dbid = Integer.valueOf(facetRecord.getTheme() felix@1436: .getCollectionItem() felix@1436: .getData().get("cross_section.dbid")); felix@1436: } felix@1436: catch (NumberFormatException nfe) { felix@1436: GWT.log("Could not extract cross-section db id from data."); felix@1436: } felix@1436: final int dbid = _dbid; felix@1436: felix@1436: map.put(dbid, Double.parseDouble(ce.getValue().toString())); felix@1436: felix@1436: disable(); felix@1436: felix@1436: kmService.getCrossSectionKMs(locale, map, 2, felix@1436: new AsyncCallback>() { felix@1436: @Override felix@1379: public void onFailure(Throwable caught) { felix@1436: GWT.log("Could not get single km for " felix@1436: + dbid + ": "+ caught.getMessage()); felix@1436: SC.warn(MSG.getString(caught.getMessage())); felix@1436: updateCollection(); felix@1436: updateGrid(); felix@1436: enable(); felix@1379: } felix@1436: @Override felix@1436: public void onSuccess(Map obj) { felix@1436: Double[] kms = obj.get(dbid); felix@1436: double closest = felix@1436: CrossSectionChartThemePanel.closest(kms, felix@1436: selected_km); felix@1436: GWT.log("Got single km for " + dbid + ", it is " felix@1436: + closest); felix@1436: SpinnerItem item = (SpinnerItem) ce.getItem(); felix@1436: item.setValue(closest); felix@1436: sendFeed(facetRecord, closest); felix@1379: } felix@1436: }); felix@1379: } felix@1379: }; felix@1379: return handler; felix@1379: } felix@1379: felix@1379: felix@1379: /** felix@1436: * Get the chosen km for given cross-section. felix@1436: */ felix@1436: final public double getKmForCrossSectionIdx(final int index) { felix@1436: double km = 0d; felix@1436: int collIdx = 0; felix@1436: while (km == 0d) { felix@1436: CollectionItem item = collection.getItem(collIdx++); felix@1436: if (item == null) { felix@1436: break; felix@1436: } felix@1436: if (item.getData() == null) continue; felix@1436: String d = item.getData().get("cross_section" + index + ".km"); felix@1436: if (d == null) { felix@1436: continue; felix@1436: } felix@1436: km = Double.valueOf(d); felix@1436: } felix@1436: return km; felix@1436: } felix@1436: felix@1436: felix@1436: /** felix@1438: * Create a "kilometer spinner" for CrossSection Facets. felix@1438: * @param facetRecord The respective Facet/Theme. felix@1438: * @return label, intialized SpinnerItem. felix@1438: */ felix@1438: public SpinnerItem createSpinnerItem(FacetRecord facetRecord) { felix@1438: SpinnerItem spinnerItem = new SpinnerItem(); felix@1438: spinnerItem.setShowTitle(false); felix@1438: spinnerItem.setTitle("Waterlevel-Spinner"); felix@1438: spinnerItem.setWidth(45); felix@1438: spinnerItem.setDefaultValue(facetRecord.getTheme() felix@1438: .getCollectionItem() felix@1438: .getData().get("cross_section.km")); felix@1438: felix@1438: // TODO actually use crosssectionkmservice with felix@1438: // min/max-extension felix@1438: spinnerItem.setMin(0); felix@1438: spinnerItem.setMax(1000); felix@1445: spinnerItem.setStep(0.5f); felix@1438: spinnerItem.setChangeOnKeypress(true); felix@1438: return spinnerItem; felix@1438: } felix@1438: felix@1438: felix@1438: /** felix@858: * Create and configure the Grid to display. felix@1438: * @return ListGrid with Themes and related controls inside. felix@858: */ felix@858: @Override felix@858: protected ListGrid createGrid() { felix@858: ListGrid list = new ListGrid() { felix@858: @Override felix@1379: protected Canvas createRecordComponent( felix@1379: final ListGridRecord record, felix@1379: Integer colNum) felix@1379: { felix@861: // Only cross_section Facets display an action widget. felix@861: final FacetRecord facetRecord = (FacetRecord) record; felix@861: if (!facetRecord.getTheme().getFacet().equals( felix@1379: "cross_section")) felix@1379: { felix@861: return null; felix@861: } felix@858: felix@858: String fieldName = this.getFieldName(colNum); felix@858: felix@888: if (fieldName.equals(GRID_FIELD_ACTIONS)) { felix@858: HLayout recordCanvas = new HLayout(3); felix@858: recordCanvas.setHeight(22); felix@858: recordCanvas.setAlign(Alignment.CENTER); felix@858: // TODO Refactor in createSpinner(data, artifact) felix@1438: SpinnerItem spinnerItem = createSpinnerItem(facetRecord); felix@1379: spinnerItem.addChangedHandler( felix@1438: createSpinnerHandler(feedService, facetRecord)); felix@858: felix@858: DynamicForm formWrap = new DynamicForm(); felix@858: formWrap.setFields(spinnerItem); felix@858: formWrap.setTitlePrefix(""); felix@858: formWrap.setTitleSuffix(""); felix@858: recordCanvas.addMember(formWrap); felix@858: return recordCanvas; felix@858: } felix@858: else { felix@858: return null; felix@858: } felix@858: } felix@858: }; felix@858: list.setCanResizeFields(true); felix@858: list.setShowRecordComponents(true); felix@858: list.setShowRecordComponentsByCell(true); felix@858: list.setShowAllRecords(true); felix@1378: list.setShowHeaderContextMenu(false); felix@858: return list; felix@858: } felix@858: felix@858: felix@858: /** felix@858: * Initializes the components (columns) of the theme grid. felix@858: */ felix@858: @Override felix@858: protected void initGrid() { felix@858: list.setCanEdit(true); felix@858: list.setCanSort(false); felix@858: list.setShowRecordComponents(true); felix@858: list.setShowRecordComponentsByCell(true); felix@858: list.setShowHeader(true); felix@858: list.setWidth100(); felix@858: list.setHeight100(); felix@858: felix@858: list.addEditCompleteHandler(this); felix@858: felix@858: ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); felix@858: active.setType(ListGridFieldType.BOOLEAN); felix@858: felix@858: ListGridField name = new ListGridField( felix@858: GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); felix@858: name.setType(ListGridFieldType.TEXT); felix@858: felix@858: ListGridField actions = new ListGridField(GRID_FIELD_ACTIONS, felix@891: MSG.chart_themepanel_header_actions(), 50); felix@858: felix@858: list.setFields(active, name, actions); felix@858: } felix@1436: felix@1436: felix@1436: /** Get Current Cross-section Masters uuid. */ felix@1436: public String getCurrentMaster() { felix@1436: return currentMasterUUID; felix@1436: } felix@1436: felix@1436: felix@1436: /** Set Current Cross-section Masters uuid. */ felix@1436: public void setCurrentMaster(String currentMasterUuid) { felix@1436: this.currentMasterUUID = currentMasterUuid; felix@1436: } felix@1444: felix@1444: felix@1444: /** felix@1444: * Create and parameterize a new area artifact. felix@1445: * @param under felix@1445: * @param over if null, something. felix@1444: */ felix@1444: public void createAreaArtifact(final Theme under, final Theme over) { felix@1444: Config config = Config.getInstance(); felix@1444: String locale = config.getLocale(); felix@1444: felix@1444: Recommendation area = new Recommendation( felix@1444: "area", felix@1444: "", felix@1444: "", felix@1444: null); felix@1444: Recommendation[] recommendations = new Recommendation[] {area}; felix@1444: felix@1444: loadService.loadMany( felix@1444: this.collection, felix@1444: recommendations, felix@1444: null, //use individual factories. felix@1444: locale, felix@1444: new AsyncCallback() { felix@1444: public void onFailure(Throwable caught) { felix@1444: GWT.log("Failed, no area artifact: " + caught.getMessage()); felix@1444: enable(); felix@1444: // TODO SC.warn felix@1444: } felix@1444: public void onSuccess(Artifact[] artifacts) { felix@1444: GWT.log("Success, created area artifact: " felix@1444: + artifacts[0].getUuid()); felix@1444: // Now, feed the artifact with the relevant data. felix@1444: feedTellArea(artifacts[0].getUuid(), under, over); felix@1444: } felix@1444: } felix@1444: ); felix@1444: } felix@1444: felix@1444: /** felix@1444: * Include area specific menu items. felix@1444: */ felix@1444: protected Menu getSingleContextMenu(final ListGridRecord[] records) { felix@1444: Menu menu = super.getSingleContextMenu(records); felix@1444: felix@1444: final Theme facetTheme = ((FacetRecord)records[0]).getTheme(); felix@1444: String thisItem = facetTheme.getDescription(); felix@1444: if (facetTheme.getFacet().equals("area")) { felix@1444: return menu; felix@1444: } felix@1444: felix@1444: menu.addItem(createSeparator()); felix@1444: felix@1444: // TODO i18n felix@1444: //MenuItem properties = new MenuItem(MSG.properties()); felix@1444: MenuItem areaMenuItem = new MenuItem("New Area..."); felix@1444: Menu areaMenu = new Menu(); felix@1444: felix@1444: ThemeList themes = getThemeList(); felix@1444: int nThemes = themes.getThemeCount(); felix@1444: for (int i = 0; i < nThemes; i++) { felix@1444: final Theme theme = themes.getThemeAt(i+1); felix@1444: if (theme.getDescription().equals(thisItem) felix@1444: || theme.getFacet().equals("area")) { felix@1444: continue; felix@1444: } felix@1444: MenuItem againster = new MenuItem(theme.getDescription()); felix@1444: areaMenu.addItem(againster); felix@1444: felix@1444: againster.addClickHandler(new ClickHandler() { felix@1444: public void onClick(MenuItemClickEvent evt) { felix@1444: disable(); felix@1444: createAreaArtifact(facetTheme, theme); felix@1444: } felix@1444: }); felix@1444: } felix@1444: felix@1444: MenuItem underMenuItem = new MenuItem("Under ..."); felix@1445: underMenuItem.addClickHandler(new ClickHandler() { felix@1445: public void onClick(MenuItemClickEvent evt) { felix@1445: disable(); felix@1445: createAreaArtifact(facetTheme, null); felix@1445: } felix@1445: }); felix@1444: MenuItem overMenuItem = new MenuItem("Over ..."); felix@1445: overMenuItem.addClickHandler(new ClickHandler() { felix@1445: public void onClick(MenuItemClickEvent evt) { felix@1445: disable(); felix@1445: createAreaArtifact(facetTheme, null); felix@1445: } felix@1445: }); felix@1444: areaMenu.addItem(createSeparator()); felix@1444: areaMenu.addItem(underMenuItem); felix@1444: areaMenu.addItem(overMenuItem); felix@1444: felix@1444: areaMenuItem.setSubmenu(areaMenu); felix@1444: menu.addItem(areaMenuItem); felix@1444: felix@1444: return menu; felix@1444: } felix@858: } felix@858: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :