/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.util.toolbar; import java.util.Iterator; import java.util.Vector; /** * This class represents one row of toolbars. * * Toolbar row is part of toolbar configuration and contains list of toolbars, * it is possible to add, remove and switch constraints. * There is cached row's neighbournhood, so when there is some row motion * those cached values are recomputed. * * @author Libor Kramolis */ public class ToolbarRow { /** ToolbarConfiguration */ ToolbarPanel toolbarConfig; /** Previous row of toolbars. */ ToolbarRow prevRow; /** Next row of toolbars. */ ToolbarRow nextRow; /** List of toolbars (ToolbarConstraints) in row. */ private Vector toolbars; /** Create new ToolbarRow. * @param own ToolbarConfiguration */ ToolbarRow (ToolbarPanel config) { toolbarConfig = config; toolbars = new Vector(); prevRow = nextRow = null; } /** Add toolbar to end of row. * @param tc ToolbarConstraints */ void addToolbar (ToolbarConstraints tc) { addToolbar2 (tc, toolbars.size()); } /** Add toolbar to specific position * @param newTC ToolbarConstraints * @param pos specified position of new toolbar */ void addToolbar (ToolbarConstraints newTC, int pos) { int index = 0; Iterator it = toolbars.iterator(); ToolbarConstraints tc; while (it.hasNext()) { tc = (ToolbarConstraints)it.next(); if (pos < tc.getPosition()) break; index++; } addToolbar2 (newTC, index); } /** Add toolbar to specific index int row * @param tc ToolbarConstraints * @param index specified index of new toolbar */ private void addToolbar2 (ToolbarConstraints tc, int index) { if (toolbars.contains (tc)) return; ToolbarConstraints prev = null; ToolbarConstraints next = null; if (index != 0) { prev = (ToolbarConstraints)toolbars.elementAt (index - 1); prev.addNextBar (tc); tc.addPrevBar (prev); } if (index < toolbars.size()) { next = (ToolbarConstraints)toolbars.elementAt (index); tc.addNextBar (next); next.addPrevBar (tc); } if ((prev != null) && (next != null)) { prev.removeNextBar (next); next.removePrevBar (prev); } tc.addOwnRow (this); toolbars.insertElementAt (tc, index); tc.updatePosition(); } /** Remove toolbar from row. * @param tc toolbar for remove */ void removeToolbar (ToolbarConstraints tc) { int index = toolbars.indexOf (tc); ToolbarConstraints prev = null; ToolbarConstraints next = null; try { prev = (ToolbarConstraints)toolbars.elementAt (index - 1); prev.removeNextBar (tc); } catch (ArrayIndexOutOfBoundsException e) { } try { next = (ToolbarConstraints)toolbars.elementAt (index + 1); next.removePrevBar (tc); next.setAnchor (ToolbarConstraints.NO_ANCHOR); } catch (ArrayIndexOutOfBoundsException e) { } if ((prev != null) && (next != null)) { prev.addNextBar (next); next.addPrevBar (prev); } toolbars.removeElement (tc); if (prev != null) { prev.updatePosition(); } else { if (next != null) { next.updatePosition(); } } } /** @return Iterator of toolbars int row. */ Iterator iterator () { return toolbars.iterator(); } /** Set a previous row. * @param prev new previous row. */ void setPrevRow (ToolbarRow prev) { prevRow = prev; } /** @return previous row. */ ToolbarRow getPrevRow () { return prevRow; } /** Set a next row. * @param next new next row. */ void setNextRow (ToolbarRow next) { nextRow = next; } /** @return next row. */ ToolbarRow getNextRow () { return nextRow; } /** @return preferred width of row. */ int getPrefWidth () { if (toolbars.isEmpty()) return -1; return ((ToolbarConstraints)toolbars.lastElement()).getPrefWidth(); } /** @return true if row is empty */ boolean isEmpty () { return toolbars.isEmpty(); } /** @return number of toolbars int row. */ int toolbarCount () { return toolbars.size(); } /** Update bounds of all row toolbars. */ void updateBounds () { Iterator it = toolbars.iterator(); ToolbarConstraints tc; while (it.hasNext()) { tc = (ToolbarConstraints)it.next(); tc.updateBounds(); } } /** Switch two toolbars. * @param left ToolbarConstraints * @param right ToolbarConstraints */ void switchBars (ToolbarConstraints left, ToolbarConstraints right) { int leftIndex = toolbars.indexOf (left); int rightIndex = toolbars.indexOf (right); ToolbarConstraints leftPrev = null; ToolbarConstraints rightNext = null; try { leftPrev = (ToolbarConstraints)toolbars.elementAt (leftIndex - 1); } catch (ArrayIndexOutOfBoundsException e) { } try { rightNext = (ToolbarConstraints)toolbars.elementAt (rightIndex + 1); } catch (ArrayIndexOutOfBoundsException e) { } if (leftPrev != null) leftPrev.removeNextBar (left); left.removePrevBar (leftPrev); left.removeNextBar (right); right.removePrevBar (left); right.removeNextBar (rightNext); if (rightNext != null) rightNext.removePrevBar (right); if (leftPrev != null) leftPrev.addNextBar (right); left.addPrevBar (right); left.addNextBar (rightNext); right.addPrevBar (leftPrev); right.addNextBar (left); if (rightNext != null) rightNext.addPrevBar (left); toolbars.setElementAt (left, rightIndex); toolbars.setElementAt (right, leftIndex); } /** Let's try switch toolbar left. * @param ToolbarConstraints */ void trySwitchLeft (ToolbarConstraints tc) { int index = toolbars.indexOf (tc); if (index == 0) return; try { ToolbarConstraints prev = (ToolbarConstraints)toolbars.elementAt (index - 1); if (ToolbarConstraints.canSwitchLeft (tc.getPosition(), tc.getWidth(), prev.getPosition(), prev.getWidth())) { switchBars (prev, tc); } } catch (ArrayIndexOutOfBoundsException e) { /* No left toolbar - it means tc is toolbar like Palette (:-)) */ } } /** Let's try switch toolbar right. * @param ToolbarConstraints */ void trySwitchRight (ToolbarConstraints tc) { int index = toolbars.indexOf (tc); try { ToolbarConstraints next = (ToolbarConstraints)toolbars.elementAt (index + 1); if (ToolbarConstraints.canSwitchRight (tc.getPosition(), tc.getWidth(), next.getPosition(), next.getWidth())) { switchBars (tc, next); next.setPosition (tc.getPosition() - next.getWidth() - ToolbarLayout.HGAP); } } catch (ArrayIndexOutOfBoundsException e) { /* No right toolbar - it means tc is toolbar like Palette (:-)) */ } } /** * @param name * @return */ public int indexOf(String name) { for (int i = 0; i < toolbars.size(); i++) { ToolbarConstraints toolbar = (ToolbarConstraints) toolbars.get(i); if(name.equals(toolbar.getName())) { return i; } } return -1; } } // end of class ToolbarRow