001 /*
002 * Copyright 2002-2007 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.util;
017
018 import java.awt.Component;
019
020 import javax.swing.JMenu;
021 import javax.swing.JMenuBar;
022 import javax.swing.JPopupMenu;
023 import javax.swing.JSeparator;
024 import javax.swing.JToolBar;
025
026 /**
027 * Utils class for consolidating separators on toolbars, popupmenus and menus.
028 *
029 * @author Benoit Xhenseval
030 * @author Peter De Bruycker
031 */
032 public class SeparatorUtils {
033
034 private SeparatorUtils() {
035 // static utils only
036 }
037
038 /**
039 * Consolidates separators in a toolbar:
040 * <ul>
041 * <li>subsequent separators will be collapsed to one separator</li>
042 * <li>if the first visible item of a menu is a separator, it will be made
043 * invisible</li>
044 * <li>if the last visible item of a menu is a separator, it will be made
045 * invisible</li>
046 * </ul>
047 * @param menu the menu (cannot be null)
048 */
049 public static void consolidateSeparators(JToolBar toolBar) {
050 Assert.notNull(toolBar, "toolBar cannot be null");
051
052 consolidateSeparators(toolBar.getComponents());
053 }
054
055 /**
056 * Consolidates separators in a popupmenu:
057 * <ul>
058 * <li>subsequent separators will be collapsed to one separator</li>
059 * <li>if the first visible item of a menu is a separator, it will be made
060 * invisible</li>
061 * <li>if the last visible item of a menu is a separator, it will be made
062 * invisible</li>
063 * </ul>
064 * @param menu the menu (cannot be null)
065 */
066 public static void consolidateSeparators(JPopupMenu popupMenu) {
067 Assert.notNull(popupMenu, "popupMenu cannot be null");
068
069 consolidateSeparators(popupMenu.getComponents());
070 }
071
072 private static void consolidateSeparators(Component[] menuComponents) {
073 Assert.notNull(menuComponents, "menuComponents cannot be null");
074
075 Component previousVisibleComponent = null;
076 boolean everythingInvisibleSoFar = true;
077
078 for (int i = 0; i < menuComponents.length; i++) {
079 Component menuComponent = menuComponents[i];
080
081 // reset all separators
082 if (menuComponent instanceof JSeparator) {
083 menuComponent.setVisible(true);
084 }
085
086 // Separator should be invisible if
087 // - previous visible item one is a separator
088 // - it is the first one visible item (ie everything invisible
089 // before)
090 if (menuComponent instanceof JSeparator && everythingInvisibleSoFar) {
091 menuComponent.setVisible(false);
092 }
093 else if (menuComponent instanceof JSeparator && previousVisibleComponent instanceof JSeparator) {
094 previousVisibleComponent.setVisible(false);
095 }
096
097 if (menuComponent instanceof JSeparator) {
098 previousVisibleComponent = menuComponent;
099 }
100 else if (menuComponent.isVisible()) {
101 everythingInvisibleSoFar = false;
102 previousVisibleComponent = menuComponent;
103 }
104
105 if (menuComponent instanceof JMenu) {
106 consolidateSeparators((JMenu) menuComponent);
107 }
108 }
109
110 // and if the last item on the menu is a separator -> make it invisible.
111 if (previousVisibleComponent instanceof JSeparator) {
112 previousVisibleComponent.setVisible(false);
113 }
114 }
115
116 /**
117 * Consolidates separators in a menu:
118 * <ul>
119 * <li>subsequent separators will be collapsed to one separator</li>
120 * <li>if the first visible item of a menu is a separator, it will be made
121 * invisible</li>
122 * <li>if the last visible item of a menu is a separator, it will be made
123 * invisible</li>
124 * </ul>
125 * @param menu the menu (cannot be null)
126 */
127 public static void consolidateSeparators(JMenu menu) {
128 Assert.notNull(menu, "menu cannot be null");
129
130 Component previousVisibleComponent = null;
131 boolean everythingInvisibleSoFar = true;
132
133 for (int j = 0; j < menu.getMenuComponentCount(); j++) {
134 Component menuComponent = menu.getMenuComponent(j);
135
136 // reset all separators
137 if (menuComponent instanceof JSeparator) {
138 menuComponent.setVisible(true);
139 }
140
141 // Separator should be invisible if
142 // - previous visible item one is a separator
143 // - it is the first one visible item (ie everything invisible
144 // before)
145 if (menuComponent instanceof JSeparator && everythingInvisibleSoFar) {
146 menuComponent.setVisible(false);
147 }
148 else if (menuComponent instanceof JSeparator && previousVisibleComponent instanceof JSeparator) {
149 previousVisibleComponent.setVisible(false);
150 }
151
152 if (menuComponent instanceof JSeparator) {
153 previousVisibleComponent = menuComponent;
154 }
155 else if (menuComponent.isVisible()) {
156 everythingInvisibleSoFar = false;
157 previousVisibleComponent = menuComponent;
158 }
159
160 if (menuComponent instanceof JMenu) {
161 consolidateSeparators((JMenu) menuComponent);
162 }
163 }
164
165 // and if the last item on the menu is a separator -> make it invisible.
166 if (previousVisibleComponent instanceof JSeparator) {
167 previousVisibleComponent.setVisible(false);
168 }
169 }
170
171 /**
172 * Consolidates separators in a menubar. This essentialy calls
173 * {@link #consolidateSeparators(JMenu)} for each menu in the menubar.
174 * @param menuBar the menu bar (cannot be null)
175 * @see #consolidateSeparators(JMenu)
176 */
177 public static void consolidateSeparators(JMenuBar menuBar) {
178 Assert.notNull(menuBar, "menu bar cannot be null");
179
180 for (int i = 0; i < menuBar.getMenuCount(); i++) {
181 consolidateSeparators(menuBar.getMenu(i));
182 }
183 }
184 }