/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.studio.components.geocoder; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JToolBar; import javax.swing.border.BevelBorder; import com.opendoorlogistics.studio.components.geocoder.model.GeocodeAverageType; import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModel; import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModelListener; import com.opendoorlogistics.utils.ui.SimpleAction; abstract class GeocodeToolbar extends JToolBar implements GeocodeModelListener{ static final int BUTTON_HEIGHT = 44; static final int BUTTON_WIDTH = 118; private final Action gotoNextAction; private final Action gotoPreviousAction; private final ArrayList<JButton> optionButtons = new ArrayList<>(); private final GeocodeModel model; GeocodeToolbar(final GeocodeModel model){ setFloatable(false); this.model = model; // create previous action gotoPreviousAction =new SimpleAction("Previous record", null, "arrow-left-3-16x16.png", null) { @Override public void actionPerformed(ActionEvent e) { model.gotoPreviousRecord(); } }; JButton previousButton=add(gotoPreviousAction); previousButton.setHideActionText(false); setButtonBorder(previousButton); setButtonSize(previousButton); // previousButton.setHorizontalTextPosition(SwingConstants.LEFT); // create buttons for each search result option for(final GeocodeAverageType option : GeocodeAverageType.values()){ JButton button = new JButton(option.getText(null,true)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { model.setGeocode(option.getAverage(model)); if(model.hasNextRecord()){ model.gotoNextRecord(); } } }); setButtonBorder(button); optionButtons.add(button); setButtonSize(button); add(button); } // create next action gotoNextAction = new SimpleAction("Next record", null, "arrow-right-3-16x16.png", null) { @Override public void actionPerformed(ActionEvent e) { model.gotoNextRecord(); } }; JButton nextButton =add(gotoNextAction); nextButton.setHideActionText(false); setButtonBorder(nextButton); setButtonSize(nextButton); JButton exitButton = add(new AbstractAction("Exit") { @Override public void actionPerformed(ActionEvent e) { onExit(); } }); setButtonBorder(exitButton); setButtonSize(exitButton); model.addListener(this); modelChanged(true, true); } private void setButtonBorder(JButton button) { button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); } private void setButtonSize(JButton button){ Dimension size=new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT); button.setSize(size); button.setMaximumSize(size); button.setMinimumSize(size); button.setPreferredSize(size); } @Override public void modelChanged(boolean recordChanged, boolean searchResultsChanged) { gotoPreviousAction.setEnabled(model.hasPreviousRecord()); gotoNextAction.setEnabled(model.hasNextRecord()); if(optionButtons.size() != GeocodeAverageType.values().length){ throw new RuntimeException(); } for(int i =0 ;i<optionButtons.size(); i++){ GeocodeAverageType type = GeocodeAverageType.values()[i]; optionButtons.get(i).setText(type.getText(model,true)); optionButtons.get(i).setEnabled(type.isAvailable(model)); } } protected abstract void onExit(); }