001: /*
002: * This file is part of the Tucana Echo2 Library.
003: * Copyright (C) 2006.
004: *
005: * Version: MPL 1.1/GPL 2.0/LGPL 2.1
006: *
007: * The contents of this file are subject to the Mozilla Public License Version
008: * 1.1 (the "License"); you may not use this file except in compliance with
009: * the License. You may obtain a copy of the License at
010: * http://www.mozilla.org/MPL/
011: *
012: * Software distributed under the License is distributed on an "AS IS" basis,
013: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
014: * for the specific language governing rights and limitations under the
015: * License.
016: *
017: * Alternatively, the contents of this file may be used under the terms of
018: * either the GNU General Public License Version 2 or later (the "GPL"), or
019: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
020: * in which case the provisions of the GPL or the LGPL are applicable instead
021: * of those above. If you wish to allow use of your version of this file only
022: * under the terms of either the GPL or the LGPL, and not to allow others to
023: * use your version of this file under the terms of the MPL, indicate your
024: * decision by deleting the provisions above and replace them with the notice
025: * and other provisions required by the GPL or the LGPL. If you do not delete
026: * the provisions above, a recipient may use your version of this file under
027: * the terms of any one of the MPL, the GPL or the LGPL.
028: */
029:
030: package tucana.echo2.app.widgetdash;
031:
032: import nextapp.echo2.app.Alignment;
033: import nextapp.echo2.app.Border;
034: import nextapp.echo2.app.Button;
035: import nextapp.echo2.app.Color;
036: import nextapp.echo2.app.Column;
037: import nextapp.echo2.app.Component;
038: import nextapp.echo2.app.Extent;
039: import nextapp.echo2.app.Font;
040: import nextapp.echo2.app.Grid;
041: import nextapp.echo2.app.ImageReference;
042: import nextapp.echo2.app.Insets;
043: import nextapp.echo2.app.Label;
044: import nextapp.echo2.app.ResourceImageReference;
045: import nextapp.echo2.app.Row;
046: import nextapp.echo2.app.event.ActionEvent;
047: import nextapp.echo2.app.event.ActionListener;
048: import nextapp.echo2.app.layout.RowLayoutData;
049:
050: import org.romaframework.aspect.view.echo2.form.EntityForm;
051: import org.romaframework.module.portal.PortalPage;
052:
053: /**
054: * Default implementation of {@link WidgetContainer}. Provides a box around the widget with a titlebar and a close button.
055: *
056: * @author Jeremy Volkman
057: */
058: public class DefaultWidgetContainer extends WidgetContainer {
059:
060: private static ImageReference closeImage;
061:
062: private static ImageReference maximizeImage;
063:
064: private Component widgetBody;
065:
066: protected Grid titleGrid;
067:
068: protected Label titleLabel;
069:
070: protected Row titleButtonRow;
071:
072: protected Column bodyColumn;
073:
074: static {
075: closeImage = new ResourceImageReference(
076: "nextapp/echo2/webcontainer/resource/image/DefaultCloseButton.gif",
077: new Extent(17), new Extent(17));
078: maximizeImage = new ResourceImageReference(
079: "org/romaframework/aspect/view/echo2/image/maximize.png",
080: new Extent(17), new Extent(17));
081: }
082:
083: public DefaultWidgetContainer(WidgetIdentifier identifier,
084: Component widget, String title) {
085: super (identifier);
086: this .widgetBody = widget;
087:
088: bodyColumn = new Column();
089: bodyColumn.setBackground(Color.WHITE);
090: Border bodyBorder = new Border(1, Color.LIGHTGRAY,
091: Border.STYLE_RIDGE);
092: bodyColumn.setBorder(bodyBorder);
093: Color titleColor = new Color(255, 222, 0);
094:
095: titleGrid = new Grid(2);
096: titleButtonRow = new Row();
097: titleButtonRow.setBackground(titleColor);
098: titleButtonRow.setInsets(new Insets(5));
099: titleButtonRow.setCellSpacing(new Extent(10, Extent.PX));
100: titleGrid.setBackground(titleColor);
101: titleGrid.setOrientation(Grid.ORIENTATION_HORIZONTAL);
102: titleGrid.setInsets(new Insets(2));
103: titleLabel = new Label();
104: titleLabel.setText(title);
105: Font f = new Font(new Font.Typeface("verdana"), Font.PLAIN,
106: new Extent(17));
107: titleLabel.setFont(f);
108: titleLabel.setForeground(new Color(242, 26, 26));
109: titleGrid.add(titleLabel);
110: titleGrid.setHeight(new Extent(20, Extent.PX));
111:
112: titleGrid.setColumnWidth(1, closeImage.getWidth());
113: Button closeButton = new Button(closeImage);
114: RowLayoutData closeLayout = new RowLayoutData();
115: closeLayout.setAlignment(new Alignment(Alignment.RIGHT,
116: Alignment.RIGHT));
117: closeButton.setLayoutData(closeLayout);
118: closeButton.setWidth(closeImage.getWidth());
119: final WidgetContainer container = this ;
120: closeButton.addActionListener(new ActionListener() {
121:
122: public void actionPerformed(ActionEvent e) {
123: processClose(container);
124: }
125: });
126: Button maximizeButton = new Button(maximizeImage);
127: RowLayoutData maximizeLayout = new RowLayoutData();
128: maximizeLayout.setAlignment(new Alignment(Alignment.RIGHT,
129: Alignment.RIGHT));
130: maximizeButton.setLayoutData(maximizeLayout);
131: maximizeButton.setWidth(maximizeImage.getWidth());
132: maximizeButton.addActionListener(new ActionListener() {
133:
134: public void actionPerformed(ActionEvent e) {
135: processMaximize(container);
136: }
137: });
138: titleButtonRow.add(maximizeButton);
139: titleButtonRow.add(closeButton);
140: titleGrid.setWidth(new Extent(100, Extent.PERCENT));
141: titleGrid.add(titleButtonRow);
142: bodyColumn.add(new WidgetGrabPoint(titleGrid, this ));
143:
144: Column widgetWrapper = new Column();
145: // Set standard widget insets so all widgets start off with the same
146: // padding. Widgets shouldn't have to set insets manually (at least
147: // for their top-level component.
148: widgetWrapper.setInsets(new Insets(4, 8));
149: widgetWrapper.add(widget);
150: bodyColumn.add(widgetWrapper);
151: add(bodyColumn);
152: }
153:
154: protected void processClose(final WidgetContainer container) {
155: container.getParent().remove(container);
156: }
157:
158: protected void processMaximize(final WidgetContainer container) {
159: processComponentOnMaximize(container);
160: }
161:
162: @Override
163: public Component getWidgetBody() {
164: return widgetBody;
165: }
166:
167: @Override
168: public String getTitle() {
169: return titleLabel.getText();
170: }
171:
172: @Override
173: public void setTitle(String iTitle) {
174: titleLabel.setText(iTitle);
175: }
176:
177: private void processComponentOnMaximize(Component iComponent) {
178: Component[] components = iComponent.getComponents();
179: for (Component component : components) {
180: if (component instanceof Column) {
181: processComponentOnMaximize(component);
182: } else if (component instanceof EntityForm) {
183: EntityForm form = (EntityForm) component;
184: Object content = form.getContent();
185: if (content instanceof PortalPage)
186: ((PortalPage) content).maximize();
187: }
188: }
189: }
190: }
|