package org.geogebra.web.web.gui.util; import org.geogebra.common.gui.SetLabels; import org.geogebra.common.main.App; import org.geogebra.common.main.Feature; import org.geogebra.common.main.OptionType; import org.geogebra.web.html5.gui.GPopupPanel; import org.geogebra.web.html5.gui.util.ViewsChangedListener; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.css.GuiResources; import org.geogebra.web.web.gui.GuiManagerW; import org.geogebra.web.web.gui.images.AppResources; import org.geogebra.web.web.gui.images.ImgResourceHelper; import org.geogebra.web.web.gui.laf.GLookAndFeel; import org.geogebra.web.web.gui.properties.PropertiesViewW; import org.geogebra.web.web.gui.view.Views; import org.geogebra.web.web.gui.view.Views.ViewType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HorizontalPanel; /** * @author G. Sturr * */ public abstract class StyleBarW extends HorizontalPanel implements ViewsChangedListener, SetLabels { PopupMenuButtonW viewButton; MyCJButton menuButton; public AppW app; protected int viewID; protected OptionType optionType; /** * @param app * {@link AppW} * @param viewID * {@code int} */ public StyleBarW(AppW app, int viewID) { this.app = app; this.viewID = viewID; this.app.addViewsChangedListener(this); } public abstract void setOpen(boolean showStyleBar); /** * adds a {@link VerticalSeparator} */ protected void addSeparator(){ VerticalSeparator s = new VerticalSeparator(32); add(s); } /** * adds a {@link MyCJButton button} to show properties dialog */ protected void addMenuButton(){ if (!app.letShowPropertiesDialog()) { return; } if(menuButton == null){ menuButton = new MyCJButton(); ImageOrText icon; if (app.has(Feature.DYNAMIC_STYLEBAR)) { icon = new ImageOrText(GuiResources.INSTANCE.stylebar_more()); menuButton.addStyleName("MyCanvasButton-borderless"); } else { icon = new ImageOrText(GuiResources.INSTANCE.menu_icon_options()); } menuButton.setIcon(icon); menuButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { // close keyboard first to avoid perspective mess app.hideKeyboard(); if (app.getGuiManager().showView(App.VIEW_PROPERTIES)) { PropertiesViewW pW = (PropertiesViewW) ((GuiManagerW) app .getGuiManager()) .getCurrentPropertiesView(); if (optionType == pW.getOptionType()) { app.getGuiManager().setShowView(false, App.VIEW_PROPERTIES); return; } } if ((!app.getSelectionManager().getSelectedGeos().isEmpty() && optionType != OptionType.ALGEBRA) || optionType == null ) { app.getDialogManager().showPropertiesDialog(OptionType.OBJECTS, null); } else{ app.getDialogManager().showPropertiesDialog(optionType, null); } } }); } add(menuButton); } protected PopupMenuButtonW getViewButton(){ return this.viewButton; } /** * adds a {@link PopupMenuButtonW button} to show a popup, where the user can * either close this view or open another one. */ protected void addViewButton(){ int numOfViews = Views.numOfViews(); ImageOrText[] data = new ImageOrText[numOfViews + 1]; final int[] viewIDs = new int[numOfViews + 1]; int k = 0; FlowPanel separator = null; final int numberOfOpenViews = app.getGuiManager().getLayout() .getDockManager().getNumberOfOpenViews(); if (numberOfOpenViews > 1) { // show close button if there are more than 1 views open data[0] = new ImageOrText(app.getLocalization().getMenu("Close")); data[0].setResource(GuiResources.INSTANCE.dockbar_close()); // placeholder for the separator (needs to be != null) data[1] = new ImageOrText(""); k = 2; separator = new FlowPanel(); separator.addStyleName("Separator"); } for (ViewType view : Views.getAll()) { if (app.supportsView(view.getID()) && !app.getGuiManager().showView(view.getID())) { data[k] = new ImageOrText( app.getLocalization().getMenu(view.getKey())); data[k].setUrl(ImgResourceHelper.safeURI(view.getIcon())); data[k].setBgSize(GLookAndFeel.VIEW_ICON_SIZE); viewIDs[k] = view.getID(); k++; } } if (k != data.length) { // make sure that data contains no entries that are null ImageOrText[] temp = data; data = new ImageOrText[k]; for (int i = 0; i < k; i++) { data[i] = temp[i]; } } viewButton = new PopupMenuButtonW(app, data, k, 1, org.geogebra.common.gui.util.SelectionTable.MODE_TEXT); viewButton.addStyleDependentName("borderless"); viewButton.addStyleDependentName("rightaligned"); ImageOrText views = new ImageOrText(); views.setResource(AppResources.INSTANCE.dots()); viewButton.setFixedIcon(views); if (separator != null) { viewButton.getMyTable().setWidget(1, 0, separator); } viewButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (!viewButton.getMyPopup().isVisible()) { ImageOrText icon = new ImageOrText(AppResources.INSTANCE .dots()); viewButton.setFixedIcon(icon); } else { ImageOrText icon = new ImageOrText(AppResources.INSTANCE .dots_active()); viewButton.setFixedIcon(icon); } } }); viewButton.getMyPopup().addCloseHandler( new CloseHandler<GPopupPanel>() { @Override public void onClose(CloseEvent<GPopupPanel> event) { ImageOrText icon = new ImageOrText(AppResources.INSTANCE.dots()); viewButton.setFixedIcon(icon); } }); viewButton.addPopupHandler(new PopupMenuHandler(){ @Override public void fireActionPerformed(PopupMenuButtonW actionButton) { int i = viewButton.getSelectedIndex(); // the first item is the close button int closeButtonIndex = 0; int separatorIndex = 1; if (numberOfOpenViews <= 1) { // close button and separator don't exist closeButtonIndex = -1; separatorIndex = -1; } app.hideKeyboard(); if (i == closeButtonIndex){ app.getGuiManager().setShowView(false, viewID); } else if (i != separatorIndex) { // ignore separator app.getGuiManager().setShowView(true, viewIDs[i]); } app.updateMenubar(); app.fireViewsChangedEvent(); }}); add(viewButton); } @Override public void onViewsChanged() { if(viewButton != null){ remove(viewButton); addViewButton(); } } @Override public void setLabels() { if (this.viewButton == null) { return; } remove(viewButton); // FIXME ONLY UPDATE TEXT addViewButton(); } }