Java tutorial
/* * License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt */ package edu.caltech.ipac.firefly.fftools; /** * User: roby * Date: 12/7/11 * Time: 1:33 PM * * 6/26/15 * User LZ * Add ZP, MP parameters for asinh stretch * * 5/04/16 * LZ * Removed ZP, MP and changed DR to beta */ import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import edu.caltech.ipac.firefly.core.Application; import edu.caltech.ipac.firefly.data.JscriptRequest; import edu.caltech.ipac.firefly.ui.GwtUtil; import edu.caltech.ipac.firefly.ui.PopupContainerForStandAlone; import edu.caltech.ipac.firefly.ui.PopupUtil; import edu.caltech.ipac.firefly.ui.creator.CommonParams; import edu.caltech.ipac.firefly.ui.creator.CoverageCreator; import edu.caltech.ipac.firefly.ui.creator.WidgetFactory; import edu.caltech.ipac.firefly.ui.creator.drawing.DrawingLayerProvider; import edu.caltech.ipac.firefly.ui.creator.eventworker.ActiveTargetCreator; import edu.caltech.ipac.firefly.ui.creator.eventworker.DrawingLayerCreator; import edu.caltech.ipac.firefly.ui.creator.eventworker.EventWorker; import edu.caltech.ipac.firefly.ui.table.NewTableEventHandler; import edu.caltech.ipac.firefly.ui.table.TabPane; import edu.caltech.ipac.firefly.ui.table.TablePreview; import edu.caltech.ipac.firefly.visualize.*; import edu.caltech.ipac.util.StringUtils; import edu.caltech.ipac.visualize.plot.RangeValues; import java.util.*; import java.util.logging.Level; /** * @author Trey Roby */ public class FitsViewerJSInterface { private static final String EXPANDED_KEY = "ExpandedKey"; private static MiniPlotWidget _mpw = null; private static final Map<String, MiniPlotWidget> mpwMap = new HashMap<String, MiniPlotWidget>(17); private static final Map<MiniPlotWidget, ArrayList<AsyncCallback<MiniPlotWidget>>> mpwCallbacks = new HashMap<MiniPlotWidget, ArrayList<AsyncCallback<MiniPlotWidget>>>(); // private static final Map<String,TabPane> tpMap= new HashMap<String,TabPane>(17); private static boolean _closeButtonClosesWindow = false; private static boolean autoOverlayEnabled = false; private static FloatingBackgroundManager _floatingBM = null; //============================================================================================ //------- Methods take the JSPlotRequest, called from javascript, converts then calls others - //============================================================================================ public static void plotImageToDiv(String div, JscriptRequest jspr) { WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, FFToolEnv.isAdvertise()); if (div != null) plotNowToTarget(div, wpr, null); } public static void plotGroupedImageToDiv(String div, JscriptRequest jspr, String group) { WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, FFToolEnv.isAdvertise()); if (div != null) plotNowToTarget(div, wpr, group); else PopupUtil.showError("Plot Error", "You must specify this \"PlotToDiv\" parameter"); } public static void plotOneFileGroup(JsArray<JscriptRequest> jsprAry, String group) { List<WebPlotRequest> reqList = new ArrayList<WebPlotRequest>(jsprAry.length()); for (int i = 0; i < jsprAry.length(); i++) { JscriptRequest jspr = jsprAry.get(i); WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, false); reqList.add(wpr); } plotFileGroupToTarget(reqList, group); } public static void plotAsExpanded(JscriptRequest jspr, boolean fullControl) { WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, FFToolEnv.isAdvertise()); plotNowAsExpanded(wpr, fullControl); } //--------------- Begin Deprecated methods -------------------------- @Deprecated public static void plotImage(JscriptRequest jspr) { WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, FFToolEnv.isAdvertise()); if (wpr.getPlotToDiv() != null) { plotNowToDiv(wpr, null); } else { if (_mpw != null) plotImageNow(wpr); } } @Deprecated public static void plotGroupedImage(JscriptRequest jspr, String group) { WebPlotRequest wpr = RequestConverter.convertToRequest(jspr, FFToolEnv.isAdvertise()); if (wpr.getPlotToDiv() != null) { plotNowToDiv(wpr, group); } else { PopupUtil.showError("Plot Error", "You must specify this \"PlotToDiv\" parameter"); } } //--------------- End Deprecated methods -------------------------- public static void addCoveragePlot(JscriptRequest jspr, String div) { Map<String, String> paramMap = jspr.asMap(); WidgetFactory factory = Application.getInstance().getWidgetFactory(); if (paramMap.containsKey(CommonParams.CENTER_COLUMNS) || paramMap.containsKey(CommonParams.CORNER_COLUMNS)) { if (!paramMap.containsKey(CommonParams.CENTER_COLUMNS)) { paramMap.put(CommonParams.CENTER_COLUMNS, "ra,dec"); } } else { paramMap.put(CommonParams.ENABLE_DEFAULT_COLUMNS, "true"); } if (!paramMap.containsKey(CommonParams.CATALOGS_AS_OVERLAYS)) { paramMap.put(CommonParams.CATALOGS_AS_OVERLAYS, "false"); } if (paramMap.containsKey(WebPlotRequest.OVERLAY_POSITION)) { enableAutoOverlays(); if (paramMap.containsKey("EVENT_WORKER_ID")) { String s = paramMap.get("EVENT_WORKER_ID"); paramMap.put("EVENT_WORKER_ID", s + "," + "target"); } else { paramMap.put("EVENT_WORKER_ID", "target"); } } TablePreview covPrev = factory.createObserverUI(WidgetFactory.COVERAGE_VIEW, paramMap); covPrev.bind(FFToolEnv.getHub()); SimplePanel panel = makeCenter(); panel.add(covPrev.getDisplay()); FFToolEnv.addToPanel(div, panel, "Coverage"); } public static void addDataSourceCoveragePlot(JscriptRequest jspr, String div) { Map<String, String> paramMap = jspr.asMap(); WidgetFactory factory = Application.getInstance().getWidgetFactory(); if (!paramMap.containsKey(CommonParams.ENABLE_DETAILS)) { paramMap.put(CommonParams.ENABLE_DETAILS, "false"); } TablePreview covPrev = factory.createObserverUI(WidgetFactory.DATA_SOURCE_COVERAGE_VIEW, paramMap); covPrev.bind(FFToolEnv.getHub()); SimplePanel panel = makeCenter(); panel.add(covPrev.getDisplay()); FFToolEnv.addToPanel(div, panel, "Coverage"); } public static void addDrawingLayer(JscriptRequest jspr) { Map<String, String> paramMap = jspr.asMap(); paramMap.put("searchProcessorId", TableJSInterface.SEARCH_PROC_ID); if (paramMap.containsKey(CommonParams.CENTER_COLUMNS) || paramMap.containsKey(CommonParams.CORNER_COLUMNS)) { if (!paramMap.containsKey(CommonParams.CENTER_COLUMNS)) { paramMap.put(CommonParams.CENTER_COLUMNS, "ra,dec"); } } else { paramMap.put(CommonParams.ENABLE_DEFAULT_COLUMNS, "true"); } WidgetFactory factory = Application.getInstance().getWidgetFactory(); DrawingLayerProvider dl = (DrawingLayerProvider) factory .createEventWorker(DrawingLayerCreator.DATASET_VIS_QUERY, paramMap); FFToolEnv.getHub().bind(dl); dl.bind(FFToolEnv.getHub()); if (paramMap.containsKey(TableJSInterface.TBL_SOURCE)) { Map<String, String> activateParams = new HashMap<String, String>(3); String url = paramMap.get(TableJSInterface.TBL_SOURCE); if (url != null) { url = FFToolEnv.modifyURLToFull(url); activateParams.put(TableJSInterface.TBL_SOURCE, url); dl.activate(null, paramMap); } } } public static void overlayRegionData(JsArrayString regionData, final String regionLayerId, final String title, final String plotId) { final String regText = "[" + regionData.join(StringUtils.STRING_SPLIT_TOKEN) + "]"; final String[] plotIdArr = (plotId == null) ? null : new String[] { plotId }; // load region data now if we have at least one loaded MiniPlotWidget with matching plot id for (MiniPlotWidget mpw : AllPlots.getInstance().getAll()) { if (plotId == null || plotId.equals(mpw.getPlotId())) { RegionLoader.loadRegion(title, regText, null, regionLayerId, plotIdArr); break; } } // load region data later if we have loading MiniPlotWidgets for (MiniPlotWidget mpw : mpwMap.values()) { if (mpw.getPlotId() == null) { ArrayList<AsyncCallback<MiniPlotWidget>> callbacks = mpwCallbacks.get(mpw); if (callbacks == null) { callbacks = new ArrayList<AsyncCallback<MiniPlotWidget>>(); mpwCallbacks.put(mpw, callbacks); } callbacks.add(new AsyncCallback<MiniPlotWidget>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(MiniPlotWidget result) { if (plotId == null || plotId.equals(result.getPlotId())) { RegionLoader.loadRegion(title, regText, null, regionLayerId, plotIdArr); } } }); } } } public static void removeRegionData(JsArrayString regionData, String regionLayerId) { String regText = "[" + regionData.join(StringUtils.STRING_SPLIT_TOKEN) + "]"; RegionLoader.removeFromRegion(regText, regionLayerId); } public static void addDataViewer(JscriptRequest jspr, String div) { Map<String, String> paramMap = jspr.asMap(); WidgetFactory factory = Application.getInstance().getWidgetFactory(); if (!paramMap.containsKey(CoverageCreator.QUERY_ID)) { paramMap.put(CoverageCreator.QUERY_ID, CommonParams.ALL_TABLES); } TablePreview covPrev = factory.createObserverUI(WidgetFactory.DATA_VIEW, paramMap); covPrev.bind(FFToolEnv.getHub()); SimplePanel panel = makeCenter(); panel.add(covPrev.getDisplay()); FFToolEnv.addToPanel(div, panel, "FITS Image"); } //LZ 6/11/15 add this method public static String serializeRangeValues(String stretchType, double lowerValue, double upperValue, double betaValue, double gammaValue, String algorithm) { RangeValues rv = RangeValues.create(stretchType, lowerValue, upperValue, betaValue, gammaValue, algorithm); return rv.serialize(); } public static String serializeRangeValues(String stretchType, double lowerValue, double upperValue, String algorithm) { RangeValues rv = RangeValues.create(stretchType, lowerValue, upperValue, algorithm); return rv.serialize(); } public static void setCloseButtonClosesWindow(boolean closeWindow) { _closeButtonClosesWindow = closeWindow; } // public static void makeTabPanelForCatalogLoading(String div,String tpName) { // if (_floatingBM==null) _floatingBM= new FloatingBackgroundManager(FloatingBackgroundManager.Position.TOP_RIGHT); // TabPane tp = new TabPane(); // tp.setSize("100%", "100%"); // tp.setTabPaneName(tpName); // tpMap.put(tpName,tp); // RootPanel root= FFToolEnv.getRootPanel(div); // root.add(tp); // new NewTableEventHandler(FFToolEnv.getHub(), tp); // } public static void makeTabPanel(String div, String tpName) { TabPane tp = new TabPane(); FFToolEnv.addToPanel(div, tp, "Tabs"); tp.setSize("100%", "100%"); tp.setTabPaneName(tpName); FFToolEnv.putPanel(tpName, tp); } public static void enableTabPanelCatalogLoading(String tpName) { Widget w = FFToolEnv.getPanelByID(tpName); if (w instanceof TabPane) { if (_floatingBM == null) _floatingBM = new FloatingBackgroundManager(FloatingBackgroundManager.Position.TOP_RIGHT); new NewTableEventHandler(FFToolEnv.getHub(), (TabPane) w); } } //====================================================================== //------------------ Private / Protected Methods ----------------------- //====================================================================== private static void plotImageNow(final WebPlotRequest request) { setWH(_mpw, request); _mpw.getOps(new MiniPlotWidget.OpsAsync() { public void ops(PlotWidgetOps widgetOps) { widgetOps.plot(request); } }); } private static void plotNowAsExpanded(final WebPlotRequest wpr, boolean fullControl) { if (!mpwMap.containsKey(EXPANDED_KEY)) { RootPanel root = RootPanel.get(); if (root != null) { SimplePanel panel = new SimplePanel(); root.add(panel); panel.setSize("1px", "1px"); final MiniPlotWidget mpw = makeMPW(null, fullControl); mpw.supportTabs(); panel.setWidget(mpw); if (_floatingBM == null && !fullControl) { _floatingBM = new FloatingBackgroundManager(FloatingBackgroundManager.Position.UNDER_TOOLBAR); } mpwMap.put(EXPANDED_KEY, mpw); setWH(mpw, wpr); mpw.getOps(new MiniPlotWidget.OpsAsync() { public void ops(final PlotWidgetOps widgetOps) { widgetOps.plotExpanded(wpr, false, new WebPlotCallback(mpw, false)); } }); } } else { final MiniPlotWidget mpw = mpwMap.get(EXPANDED_KEY); mpw.getOps(new MiniPlotWidget.OpsAsync() { public void ops(PlotWidgetOps widgetOps) { widgetOps.plotExpanded(wpr, false, new WebPlotCallback(mpw, false)); } }); } MiniPlotWidget mpw = mpwMap.get(EXPANDED_KEY); if (mpw.getPopoutContainer() instanceof PopupContainerForStandAlone) { ((PopupContainerForStandAlone) mpw.getPopoutContainer()) .setCloseBrowserWindow(_closeButtonClosesWindow); } } private static MiniPlotWidget makeMPW(String groupName) { return makeMPW(groupName, false); } private static void enableAutoOverlays() { if (!autoOverlayEnabled) { autoOverlayEnabled = true; Map<String, String> params = new HashMap<String, String>(5); params.put(EventWorker.ID, "target"); params.put(CommonParams.TARGET_TYPE, ActiveTargetCreator.TargetType.PlotFixedTarget.toString()); EventWorker targetLayer = new WidgetFactory().createEventWorker(CommonParams.ACTIVE_TARGET, params); targetLayer.bind(FFToolEnv.getHub()); } } private static MiniPlotWidget makeMPW(String groupName, boolean fullControl) { final MiniPlotWidget mpw = new MiniPlotWidget(groupName, new PopupContainerForStandAlone(fullControl)); GwtUtil.setStyles(mpw, "fontFamily", "tahoma,arial,helvetica,sans-serif", "fontSize", "11px"); mpw.setRemoveOldPlot(true); mpw.setMinSize(50, 50); mpw.setAutoTearDown(false); mpw.setLockImage(false); if (autoOverlayEnabled) { mpw.getOps(new MiniPlotWidget.OpsAsync() { public void ops(final PlotWidgetOps widgetOps) { FFToolEnv.getHub().getDataConnectionDisplay().addPlotView(mpw.getPlotView(), Arrays.asList("target")); } }); } return mpw; } private static void plotNowToDiv(WebPlotRequest wpr, String groupName) { final String div = wpr.getPlotToDiv(); plotNowToTarget(div, wpr, groupName); } private static void plotFileGroupToTarget(final List<WebPlotRequest> wprList, final String groupName) { List<MiniPlotWidget> mpwList = new ArrayList<MiniPlotWidget>(wprList.size()); for (WebPlotRequest wpr : wprList) { String div = wpr.getPlotToDiv(); if (wpr.containsParam(WebPlotRequest.OVERLAY_POSITION)) { enableAutoOverlays(); } MiniPlotWidget mpw; if (mpwMap.containsKey(div)) { mpw = mpwMap.get(div); } else { SimplePanel panel = makeCenter(); FFToolEnv.addToPanel(div, panel, "FITS Image"); mpw = createInDiv(panel, div, groupName, false); } mpwList.add(mpw); setWH(mpw, wpr); } PlotWidgetOps.plotOneFileGroup(null, wprList, mpwList, false, new AsyncCallback<WebPlot>() { public void onFailure(Throwable caught) { } public void onSuccess(WebPlot result) { } }); } public static void plotNowToTarget(final String target, final WebPlotRequest wpr, final String groupName) { if (target != null) { wpr.setPlotId(target); if (wpr.containsParam(WebPlotRequest.OVERLAY_POSITION)) { enableAutoOverlays(); } if (mpwMap.containsKey(target)) { final MiniPlotWidget mpw = mpwMap.get(target); plot(mpw, groupName, wpr); } else { SimplePanel panel = makeCenter(); FFToolEnv.addToPanel(target, panel, "FITS Image"); createAndPlot(panel, target, groupName, wpr, false); } } } private static MiniPlotWidget createInDiv(SimplePanel panel, String target, String groupName, boolean enableCatalogs) { MiniPlotWidget mpw = makeMPW(groupName); mpw.addStyleName("standard-border"); mpw.setCatalogButtonEnable(enableCatalogs); panel.setWidget(mpw); panel.addStyleName("fits-input-cmd-main-widget"); mpwMap.put(target, mpw); return mpw; } private static void createAndPlot(SimplePanel panel, String target, String groupName, WebPlotRequest wpr, boolean enableCatalogs) { MiniPlotWidget mpw = createInDiv(panel, target, groupName, enableCatalogs); plot(mpw, groupName, wpr); } private static void setWH(MiniPlotWidget mpw, WebPlotRequest wpr) { int w = mpw.getOffsetWidth(); int h = mpw.getOffsetHeight(); if (w > 5 && wpr.getZoomToWidth() == 0) { wpr.setZoomToWidth(w - 6); } if (h > 5 && wpr.getZoomToHeight() == 0) { wpr.setZoomToHeight(h); } } private static void plot(final MiniPlotWidget mpw, final String groupName, final WebPlotRequest wpr) { setWH(mpw, wpr); mpw.getOps(new MiniPlotWidget.OpsAsync() { public void ops(PlotWidgetOps widgetOps) { if (!StringUtils.isEmpty(groupName)) mpw.getGroup().setLockRelated(true); widgetOps.plot(wpr, false, new WebPlotCallback(mpw, !StringUtils.isEmpty(groupName))); } }); } protected static SimplePanel makeCenter() { final SimplePanel center = new SimplePanel(); center.setSize("100%", "100%"); return center; } private static class WebPlotCallback implements AsyncCallback<WebPlot> { private final boolean lock; private final MiniPlotWidget mpw; public WebPlotCallback(MiniPlotWidget mpw, boolean lock) { this.lock = lock; this.mpw = mpw; } public void onSuccess(WebPlot plot) { if (lock) mpw.getGroup().setLockRelated(lock); FFToolEnv.getHub().getCatalogDisplay().addPlotView(plot.getPlotView()); // complete callbacks waiting on MiniPlotWidget to load ArrayList<AsyncCallback<MiniPlotWidget>> callbacks = mpwCallbacks.get(mpw); if (callbacks != null) { mpwCallbacks.remove(mpw); for (AsyncCallback<MiniPlotWidget> c : callbacks) { try { c.onSuccess(mpw); } catch (Exception e) { GwtUtil.getClientLogger().log(Level.INFO, "unable to complete a callback on plot id " + mpw.getPlotId() + " " + e.getMessage()); } } } } public void onFailure(Throwable caught) { mpwCallbacks.remove(mpw); } } }