package org.geogebra.web.web.gui.view.spreadsheet; import org.geogebra.common.gui.view.algebra.DialogType; import org.geogebra.common.gui.view.spreadsheet.CreateObjectModel; import org.geogebra.common.gui.view.spreadsheet.CreateObjectModel.ICreateObjectListener; import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW; import org.geogebra.web.html5.gui.util.CardPanel; import org.geogebra.web.html5.gui.util.LayoutUtilW; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.html5.main.DrawEquationW; import org.geogebra.web.web.gui.dialog.InputDialogW; import org.geogebra.web.web.gui.view.algebra.InputPanelW; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; /** * Dialog to create GeoElements (lists, matrices, tabletext, etc.) from * spreadsheet cell selections * * @author G. Sturr * */ public class CreateObjectDialogW extends InputDialogW implements ICreateObjectListener { private CreateObjectModel coModel; private Label lblObject, lblName; private CheckBox ckSort; /** transpose checkbox */ CheckBox ckTranspose; private RadioButton btnValue, btnObject; /** switch scan between rows and columns */ ListBox cbScanOrder; private boolean isIniting = true; private FlowPanel optionsPanel; private FlowPanel typePanel; /** name input */ AutoCompleteTextFieldW fldName; private ScrollPanel previewPanel; /** box for coord order */ ListBox cbLeftRightOrder; private CardPanel cards; private Label lblPreview; private FlowPanel optionPane; //private DefaultListModel model; private ListBox typeList; private Label lblPreviewHeader; private Label lblOptions; private FlowPanel centerPanel; /** * @param app * app * @param view * spreadsheet * @param objectType * resulting object type */ public CreateObjectDialogW(AppW app, SpreadsheetViewW view, int objectType) { super(false, app, false); MyTableW table = (MyTableW) view.getSpreadsheetTable(); coModel = new CreateObjectModel(app, objectType, this); coModel.setCellRangeProcessor(table.getCellRangeProcessor()); coModel.setSelectedCellRanges(table.selectedCellRanges); // cp = table.getCellRangeProcessor(); // selectedCellRanges = table.selectedCellRanges; // boolean showApply = false; // createGUI(coModel.getTitle(), coModel.getTitle(), false, 16, 1, false, false, false, showApply, DialogType.GeoGebraEditor); createAdditionalGUI(); isIniting = false; setLabels(); // setTitle((String) model.getElementAt(objectType)); // optionPane.add(inputPanel, BorderLayout.CENTER); typeList.setSelectedIndex(objectType); objectTypeChanged(); centerAndFocus(false);// updateGUI(); } /** * Change object type in model */ void objectTypeChanged() { coModel.setObjectType(typeList.getSelectedIndex()); coModel.createNewGeo(fldName.getText()); } private void createAdditionalGUI() { // model = new DefaultListModel(); typeList = new ListBox(); typeList.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { objectTypeChanged(); } }); lblName = new Label(); lblName.setStyleName("panelTitle"); InputPanelW input = new InputPanelW(app, -1, false); fldName = input.getTextComponent(); fldName.showPopupSymbolButton(true); fldName.addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { apply(fldName); } }); cbScanOrder = new ListBox(); cbScanOrder.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { apply(cbScanOrder); } }); cbLeftRightOrder = new ListBox(); cbLeftRightOrder.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { apply(cbLeftRightOrder); } }); btnObject = new RadioButton("group1", ""); btnValue = new RadioButton("group1", ""); btnObject.setValue(true); ckSort = new CheckBox(); ckSort.setValue(false); ckTranspose = new CheckBox(); ckTranspose.setValue(false); ckTranspose.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { apply(ckTranspose); } }); lblObject = new Label(); lblObject.setStyleName("panelTitle"); if (coModel.getObjectType() < 0) { coModel.setListType(); typePanel = new FlowPanel(); typePanel.add(lblObject); typePanel.add(typeList); optionPane.add(typePanel); } FlowPanel namePanel = new FlowPanel(); namePanel.add(lblName); namePanel.add(fldName); buildOptionsPanel(); FlowPanel p = new FlowPanel(); p.add(namePanel); p.add(optionsPanel); lblPreview = new Label(); previewPanel = new ScrollPanel(lblPreview); previewPanel.setStyleName("createObjectsScrollArea"); FlowPanel op = new FlowPanel(); op.add(p); optionPane.add(op); FlowPanel pp = new FlowPanel(); lblPreviewHeader = new Label(); pp.add(lblPreviewHeader); lblPreviewHeader.setStyleName("panelTitle"); pp.add(previewPanel); pp.setStyleName("createObjectsPreview"); centerPanel.add(LayoutUtilW.panelRow(optionPane, pp)); } private void buildOptionsPanel() { optionPane = new FlowPanel(); lblOptions = new Label(); lblOptions.setStyleName("panelTitle"); FlowPanel copyPanel = new FlowPanel(); copyPanel.add(btnObject); copyPanel.add(btnValue); // copyPanel.add(cbTake); FlowPanel northPanel = new FlowPanel(); northPanel.add(copyPanel); FlowPanel orderPanel = new FlowPanel(); orderPanel.add(cbScanOrder); FlowPanel transposePanel = new FlowPanel(); transposePanel.add(ckTranspose); FlowPanel xySwitchPanel = new FlowPanel(); xySwitchPanel.add(cbLeftRightOrder); //pointListPanel.add(Box.createRigidArea(lblName.getSize())); // TODO: this is not a good way to manage visibility of option panels // ..fix it if we need more options in the future cards = new CardPanel(); //cards.getTabBar().setVisible(false); cards.setStyleName("panelIndent"); cards.add(orderPanel); cards.add(xySwitchPanel); cards.add(transposePanel); optionsPanel = new FlowPanel(); optionsPanel.add(northPanel); optionsPanel.add(lblOptions); // app.borderWest()); optionsPanel.add(cards); } @Override public void setLabels() { if (isIniting){ return; } // TODO: using buttons incorrectly for now // btnOK = cancel, cancel = create btOK.setText(loc.getMenu("Create")); btApply.setText(loc.getMenu("Apply")); btCancel.setText(loc.getMenu("Cancel")); // object/value checkboxes btnObject.setText(loc.getMenu("DependentObjects")); btnValue.setText(loc.getMenu("FreeObjects")); // transpose checkbox ckTranspose.setText(loc.getMenu("Transpose")); ckSort.setText(loc.getMenu("Sort")); lblName.setText(loc.getMenu("Name") + ": "); /* * lblTake.setText(loc.getMenu("Take") + ": "); * lblOrder.setText(loc.getMenu("Order") + ":"); * lblXYOrder.setText(loc.getMenu("Order") + ": "); */ cbScanOrder.clear(); cbScanOrder.addItem(loc.getMenu("RowOrder")); cbScanOrder.addItem(loc.getMenu("ColumnOrder")); cbLeftRightOrder.clear(); cbLeftRightOrder.addItem(loc.getMenu("X->Y")); cbLeftRightOrder.addItem(loc.getMenu("Y<-X")); typeList.clear(); for (String item : coModel.getObjectTypeNames()) { typeList.addItem(item); } lblObject.setText(loc.getMenu("Object") + ":"); lblPreviewHeader.setText(loc.getMenu("Preview") + ":"); // // namePanel.setBorder(BorderFactory.createCompoundBorder( // BorderFactory.createTitledBorder(loc.getMenu("Name")), // BorderFactory.createEmptyBorder(5, 5, 5, 5))); lblOptions.setText(loc.getMenu("Options")); wrappedPopup.getCaption().setText(coModel.getTitle()); } private void updateGUI() { coModel.update(); int idx = coModel.getOptionType(); cards.setSelectedIndex(idx); } @Override public void updatePreview(String latexStr, boolean isLatexDrawable) { if (latexStr != null && isLatexDrawable) { Canvas c = Canvas.createIfSupported(); previewPanel.setWidget(c); DrawEquationW.paintOnCanvas(coModel.getGeo(), "\\mathrm {" + latexStr + "}", c, app.getFontSizeWeb()); } else { previewPanel.setWidget(lblPreview); lblPreview.getElement().removeAllChildren(); lblPreview.setText(coModel.getNonLatexText()); } } /** * Process confirmation event (blur, change, click) * * @param source * event source */ void apply(Widget source) { if (source == fldName) { doTextFieldActionPerformed(); } else // btCancel acts as create for now if (source == btCancel) { coModel.cancel(); } else if (source == btApply) { // processInput(); // btOK acts as cancel for now } else if (source == btOK) { coModel.ok(); } else if (source == btnObject) { btnValue.setValue(!btnObject.getValue()); coModel.createNewGeo(fldName.getText()); } else if (source == btnValue) { btnObject.setValue(!btnValue.getValue()); coModel.createNewGeo(fldName.getText()); } else if (source == cbScanOrder || source == cbLeftRightOrder || source == ckTranspose) { coModel.createNewGeo(fldName.getText()); } } @Override protected void actionPerformed(DomEvent event) { Widget source = (Widget) event.getSource(); apply(source); } private void doTextFieldActionPerformed() { coModel.createNewGeo(fldName.getText()); } @Override public void setVisible(boolean isVisible) { // if (isModal()) { // if (isVisible) { // set old mode again // wrappedDialog.addWindowFocusListener(this); // } else { // wrappedDialog.removeWindowFocusListener(this); // app.setSelectionListenerMode(null); // } // } // // clean up on exit: either remove our geo or keep it and make it // visible if (!isVisible) { coModel.cleanUp(); } wrappedPopup.setVisible(isVisible); } @Override public void setName(String name) { fldName.setText(name); } @Override public void setSortVisible(boolean isVisible) { ckSort.setVisible(isVisible); } @Override public boolean isVisible() { return wrappedPopup != null && wrappedPopup.isVisible(); } @Override public boolean isCopiedByValue() { return btnValue.getValue(); } @Override public boolean isScannedByColumn() { return cbScanOrder.getSelectedIndex() == 1; } @Override public boolean isLeftToRight() { return cbLeftRightOrder.getSelectedIndex() == 0; } @Override public boolean isTranspose() { return ckTranspose.getValue(); } @Override protected void createGUI(String title, String message, boolean autoComplete, int columns, int rows, boolean showSymbolPopupIcon, boolean selectInitText, boolean showProperties, boolean showApply1, DialogType type) { centerPanel = new FlowPanel(); btOK = new Button(); btOK.addClickHandler(this); btCancel = new Button(); btCancel.addStyleName("cancelBtn"); btCancel.addClickHandler(this); btApply = new Button(); btApply.addClickHandler(this); // create button panel btPanel = new FlowPanel(); btPanel.addStyleName("DialogButtonPanel"); btPanel.add(btOK); btPanel.add(btCancel); // just tmp. if (showApply1) { btPanel.add(btApply); } // if (showProperties) { // btPanel.add(btProperties); // } setLabels(); FlowPanel mainPanel = new FlowPanel(); mainPanel.addStyleName("Dialog-content"); mainPanel.add(centerPanel); mainPanel.add(btPanel); wrappedPopup.setWidget(mainPanel); } }