001: /*
002: * Copyright 2006-2007 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt.
007: *
008: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
009: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
010: * the license for the specific language governing your rights and limitations.
011: *
012: * Additional Contributor(s): Martin Schmid gridvision engineering GmbH
013: */
014: package org.pentaho.reportdesigner.crm.report;
015:
016: import org.jetbrains.annotations.NonNls;
017: import org.jetbrains.annotations.NotNull;
018: import org.pentaho.reportdesigner.crm.report.lineal.LinealModel;
019: import org.pentaho.reportdesigner.crm.report.lineal.VerticalLabel;
020: import org.pentaho.reportdesigner.crm.report.lineal.VerticalLinealComponent;
021: import org.pentaho.reportdesigner.lib.client.i18n.TranslationManager;
022: import org.pentaho.reportdesigner.lib.client.undo.Undo;
023: import org.pentaho.reportdesigner.lib.client.util.FontUtils;
024:
025: import javax.swing.*;
026: import java.awt.*;
027: import java.awt.event.FocusEvent;
028: import java.awt.event.FocusListener;
029: import java.awt.event.MouseAdapter;
030: import java.awt.event.MouseEvent;
031: import java.awt.event.MouseMotionAdapter;
032: import java.util.ArrayList;
033: import java.util.logging.Level;
034: import java.util.logging.Logger;
035:
036: /**
037: * User: Martin
038: * Date: 25.01.2006
039: * Time: 18:17:48
040: */
041: public class BandsComponent extends JComponent implements Scrollable {
042: @NonNls
043: @NotNull
044: private static final Logger LOG = Logger
045: .getLogger(BandsComponent.class.getName());
046:
047: @NotNull
048: private ArrayList<ReportBorderPanel> reportBorderPanels;
049: @NotNull
050: private ArrayList<GrabberComponent> grabberComponents;
051: @NotNull
052: private ArrayList<VerticalLabel> verticalLabels;
053: @NotNull
054: private ArrayList<VerticalLinealComponent> verticalLineals;
055:
056: @NotNull
057: private BandsComponentHelper bandsComponentHelper;
058:
059: @NotNull
060: private JPanel bottomHelperPanel;
061:
062: public BandsComponent() {
063: setLayout(new BandsComponentLayoutManager(this ));
064: reportBorderPanels = new ArrayList<ReportBorderPanel>();
065: grabberComponents = new ArrayList<GrabberComponent>();
066: verticalLabels = new ArrayList<VerticalLabel>();
067: verticalLineals = new ArrayList<VerticalLinealComponent>();
068:
069: bandsComponentHelper = new BandsComponentHelper(this );
070: bottomHelperPanel = new JPanel();
071: bottomHelperPanel.setBorder(BorderFactory.createMatteBorder(1,
072: 0, 0, 0, Color.LIGHT_GRAY));
073: }
074:
075: public void updateReportBorderPanels(@NotNull
076: ArrayList<ReportBorderPanel> reportBorderPanels) {
077: clear();
078: for (ReportBorderPanel reportBorderPanel : reportBorderPanels) {
079: addReportBorderPanel(reportBorderPanel);
080: }
081:
082: add(bottomHelperPanel);
083: }
084:
085: private void clear() {
086: reportBorderPanels.clear();
087: grabberComponents.clear();
088: verticalLineals.clear();
089: verticalLabels.clear();
090: bandsComponentHelper.removeAll();
091: removeAll();
092: }
093:
094: private void addReportBorderPanel(@NotNull
095: final ReportBorderPanel reportBorderPanel) {
096: add(reportBorderPanel);
097:
098: reportBorderPanels.add(reportBorderPanel);
099:
100: final LinealModel linealModel = reportBorderPanel
101: .getReportPanel().getVerticalLinealModel();
102: if (linealModel != null) {
103: VerticalLinealComponent verticalLinealComponent = new VerticalLinealComponent(
104: reportBorderPanel.getReportPanel()
105: .getReportDialog(), reportBorderPanel
106: .isShowTopBorder(), reportBorderPanel
107: .isShowBottomBorder(), linealModel);
108:
109: verticalLinealComponent.setScaleFactor(reportBorderPanel
110: .getReportPanel().getScaleFactor());
111:
112: GrabberComponent grabberComponent = new GrabberComponent();
113:
114: final int[] startY = new int[1];
115:
116: grabberComponent.addMouseListener(new MouseAdapter() {
117: public void mousePressed(@NotNull
118: MouseEvent e) {
119: Undo undo = reportBorderPanel.getReportPanel()
120: .getReportDialog().getUndo();
121: undo.startTransaction(PropertyKeys.VISUAL_HEIGHT);
122: startY[0] = e.getY();
123: bandsComponentHelper
124: .setCursor(Cursor
125: .getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
126: }
127:
128: public void mouseReleased(@NotNull
129: MouseEvent e) {
130: Undo undo = reportBorderPanel.getReportPanel()
131: .getReportDialog().getUndo();
132: undo.endTransaction();
133: bandsComponentHelper.setCursor(Cursor
134: .getDefaultCursor());
135: }
136: });
137:
138: grabberComponent
139: .addMouseMotionListener(new MouseMotionAdapter() {
140: public void mouseDragged(@NotNull
141: MouseEvent e) {
142: int diff = startY[0] - e.getY();
143: ReportPanel reportPanel = reportBorderPanel
144: .getReportPanel();
145: double height = reportPanel
146: .getBandToplevelReportElement()
147: .getVisualHeight()
148: - diff
149: / reportPanel.getScaleFactor();
150: reportPanel
151: .getBandToplevelReportElement()
152: .setVisualHeight(
153: Math
154: .max(
155: height,
156: reportBorderPanel
157: .isShowTopBorder() ? 0
158: : 5));
159: }
160: });
161:
162: grabberComponents.add(grabberComponent);
163: verticalLineals.add(verticalLinealComponent);
164:
165: bandsComponentHelper.add(grabberComponent);
166: bandsComponentHelper.add(verticalLinealComponent);
167:
168: String text = TranslationManager.getInstance()
169: .getTranslation(
170: "R",
171: reportBorderPanel.getReportPanel()
172: .getBandToplevelReportElement()
173: .getBandToplevelType().getName());
174: final VerticalLabel label = new VerticalLabel(text);
175: reportBorderPanel.getReportPanel().addFocusListener(
176: new FocusListener() {
177: public void focusGained(@NotNull
178: FocusEvent e) {
179: label.setFont(FontUtils.getDerivedFont(
180: label.getFont(), Font.BOLD, label
181: .getFont().getSize()));
182: }
183:
184: public void focusLost(@NotNull
185: FocusEvent e) {
186: if (!e.isTemporary()) {
187: label.setFont(FontUtils.getDerivedFont(
188: label.getFont(), Font.PLAIN,
189: label.getFont().getSize()));
190: }
191: }
192: });
193: label.addMouseListener(new MouseAdapter() {
194: public void mouseClicked(@NotNull
195: MouseEvent e) {
196: if (e.getButton() == MouseEvent.BUTTON1) {
197: reportBorderPanel.getReportPanel()
198: .requestFocusInWindow();
199: }
200: }
201: });
202: label.setToolTipText(text);
203: grabberComponent.setToolTipText(text);
204: verticalLabels.add(label);
205: bandsComponentHelper.add(label);
206:
207: revalidate();
208: repaint();
209: } else {
210: if (LOG.isLoggable(Level.SEVERE))
211: LOG
212: .log(Level.SEVERE,
213: "BandsComponent.addReportBorderPanel lineal model is null");
214: }
215: }
216:
217: @NotNull
218: public BandsComponentHelper getBandsComponentHelper() {
219: return bandsComponentHelper;
220: }
221:
222: @NotNull
223: public ArrayList<ReportBorderPanel> getReportBorderPanels() {
224: return reportBorderPanels;
225: }
226:
227: @NotNull
228: public ArrayList<GrabberComponent> getGrabberComponents() {
229: return grabberComponents;
230: }
231:
232: @NotNull
233: public ArrayList<VerticalLabel> getVerticalLabels() {
234: return verticalLabels;
235: }
236:
237: @NotNull
238: public ArrayList<VerticalLinealComponent> getVerticalLineals() {
239: return verticalLineals;
240: }
241:
242: @NotNull
243: public JPanel getBottomHelperPanel() {
244: return bottomHelperPanel;
245: }
246:
247: public void setScaleFactor(double sf) {
248: for (VerticalLinealComponent verticalLinealComponent : verticalLineals) {
249: verticalLinealComponent.setScaleFactor(sf);
250: }
251: }
252:
253: @NotNull
254: public Dimension getPreferredScrollableViewportSize() {
255: return new Dimension(1, 1);
256: }
257:
258: public int getScrollableUnitIncrement(@NotNull
259: Rectangle visibleRect, int orientation, int direction) {
260: return 20;
261: }
262:
263: public int getScrollableBlockIncrement(@NotNull
264: Rectangle visibleRect, int orientation, int direction) {
265: return 100;
266: }
267:
268: public boolean getScrollableTracksViewportWidth() {
269: return false;
270: }
271:
272: public boolean getScrollableTracksViewportHeight() {
273: return false;
274: }
275:
276: }
|