/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ package org.geogebra.desktop.gui.dialog.options; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.border.Border; import org.geogebra.common.gui.SetLabels; import org.geogebra.common.gui.dialog.options.OptionsObject; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.desktop.gui.color.GeoGebraColorChooser; import org.geogebra.desktop.gui.dialog.PropertiesPanelD; import org.geogebra.desktop.gui.view.algebra.AlgebraTree; import org.geogebra.desktop.gui.view.algebra.AlgebraTreeController; import org.geogebra.desktop.main.AppD; /** * @author Markus Hohenwarter */ public class OptionsObjectD extends OptionsObject implements OptionPanelD, SetLabels { private PropertiesPanelD propPanel; private GeoGebraColorChooser colChooser; private AlgebraTree tree; private JSplitPane splitPane; private JScrollPane listScroller; private JPanel wrappedPanel; private AppD app; /** * Creates new PropertiesDialog. * * @param app * parent frame */ public OptionsObjectD(AppD app) { this.app = app; // build GUI initGUI(); } /** * inits GUI with labels of current language */ public void initGUI() { wrappedPanel = new JPanel(); boolean wasShowing = wrappedPanel.isShowing(); if (wasShowing) { setVisible(false); } // LIST PANEL Kernel kernel = app.getKernel(); tree = new AlgebraTree(new AlgebraTreeController(kernel), false); listScroller = new JScrollPane(tree); listScroller.setMinimumSize(new Dimension(MIN_LIST_WIDTH, 200)); listScroller.setBackground(Color.white); // PROPERTIES PANEL if (colChooser == null) { // init color chooser colChooser = new GeoGebraColorChooser(app); } // check for null added otherwise you get two listeners for the // colChooser // when a file is loaded if (propPanel == null) { propPanel = new PropertiesPanelD(app, colChooser, false); propPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); } // put it all together wrappedPanel.removeAll(); splitPane = new JSplitPane(); splitPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); splitPane.setLeftComponent(listScroller); splitPane.setRightComponent(propPanel); wrappedPanel.setLayout(new BorderLayout()); // this.add(propPanel, BorderLayout.CENTER); wrappedPanel.add(splitPane, BorderLayout.CENTER); if (wasShowing) { setVisible(true); } setLabels(); } public PropertiesPanelD getPropPanel() { return propPanel; } /** * show slider tab */ public void showSliderTab() { if (propPanel != null) { propPanel.showSliderTab(); } } /** * Update the labels of this dialog. * * TODO Create "Apply Defaults" phrase (F.S.) */ @Override public void setLabels() { propPanel.setLabels(); } /** * shows this dialog and select GeoElement geo at screen position location */ public void setVisibleWithGeos(ArrayList<GeoElement> geos) { app.getKernel().clearJustCreatedGeosInViews(); setViewActive(true); if (!wrappedPanel.isShowing()) { // ensure min size Dimension dim = wrappedPanel.getSize(); if (dim.width < MIN_WIDTH) { dim.width = MIN_WIDTH; wrappedPanel.setSize(dim); } if (dim.height < MIN_HEIGHT) { dim.height = MIN_HEIGHT; wrappedPanel.setSize(dim); } wrappedPanel.setVisible(true); } } /** * @param visible * whether to show this */ public void setVisible(boolean visible) { if (visible) { setVisibleWithGeos(null); } else { wrappedPanel.setVisible(false); setViewActive(false); } } private void setViewActive(boolean flag) { if (flag == viewActive) { return; } viewActive = flag; } private boolean viewActive = false; private int dividerLocation = MIN_LIST_WIDTH; /** * show the geo list */ public void setGeoTreeVisible() { splitPane.setDividerSize(8); splitPane.setDividerLocation(dividerLocation); listScroller.setVisible(true); splitPane.repaint(); } /** * hide the geo list */ public void setGeoTreeNotVisible() { listScroller.setVisible(false); dividerLocation = splitPane.getDividerLocation(); splitPane.setDividerSize(0); splitPane.repaint(); } /* * update selection regarding Application * * public void updateSelection() { updateSelection(app.getSelectedGeos()); } */ /** * update selection for properties panel * * @param geos * geos */ public void updateSelection(ArrayList<GeoElement> geos) { setSelection(geos); propPanel.updateSelection(geos.toArray()); } /** * @return the tree */ public AlgebraTree getTree() { return tree; } @Override public void updateGUI() { setLabels(); } /** * update geo if in selection * * @param geo * geo */ public void updateIfInSelection(GeoElement geo) { // AbstractApplication.printStacktrace("\ngeo = "+geo+"\nselected = // "+geo.isSelected()+"\nhighlighted = "+geo.doHighlighting()); // AbstractApplication.debug("\ngeo = "+geo+"\nselection contains = // "+(selection!=null // && selection.contains(geo))); if (getSelection() != null && getSelection().size() == 1 && getSelection().contains(geo)) { // propPanel.updateSelection(selection.toArray()); //TODO update // only first tab, set flag to others propPanel.updateOneGeoDefinition(geo); } } /** * rename geo * * @param geo * element to be renamed */ public void rename(GeoElement geo) { if (getSelection() != null && getSelection().size() == 1 && getSelection().contains(geo)) { propPanel.updateOneGeoName(geo); } } /** * update visual style of geo * * @param geo * geo */ public void updateVisualStyle(GeoElement geo) { // AbstractApplication.printStacktrace("\ngeo = "+geo+"\nselected = // "+geo.isSelected()+"\nhighlighted = "+geo.doHighlighting()); // AbstractApplication.debug("\ngeo = "+geo+"\nselection contains = // "+(selection!=null // && selection.contains(geo))); /* * if (selection != null && selection.contains(geo)) * propPanel.updateSelection(selection.toArray()); // TODO update only * // first tab, set // flag to others */ propPanel.updateVisualStyle(geo); } @Override public void revalidate() { getWrappedPanel().revalidate(); } @Override public void setBorder(Border border) { // TODO Auto-generated method stub } public Dimension getPreferredSize() { return wrappedPanel.getPreferredSize(); } public void setMinimumSize(Dimension preferredSize) { wrappedPanel.setMinimumSize(preferredSize); } @Override public JPanel getWrappedPanel() { return wrappedPanel; } @Override public void applyModifications() { propPanel.applyModifications(); } @Override public void updateFont() { tree.updateFonts(); propPanel.updateFonts(); } @Override public void setSelected(boolean flag) { // isSelected = flag; } /** * @param geo * GeoText to be updated */ public void updateTextEditor(GeoElement geo) { propPanel.updateTextEditor(geo); } } // PropertiesDialog