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.templateplugin;
015:
016: import org.jetbrains.annotations.NonNls;
017: import org.jetbrains.annotations.NotNull;
018: import org.jetbrains.annotations.Nullable;
019: import org.jfree.report.function.Expression;
020: import org.pentaho.reportdesigner.crm.report.IconLoader;
021: import org.pentaho.reportdesigner.crm.report.connection.ColumnInfo;
022: import org.pentaho.reportdesigner.crm.report.lineal.GuideLine;
023: import org.pentaho.reportdesigner.crm.report.model.BandToplevelReportElement;
024: import org.pentaho.reportdesigner.crm.report.model.BandToplevelType;
025: import org.pentaho.reportdesigner.crm.report.model.LabelReportElement;
026: import org.pentaho.reportdesigner.crm.report.model.MessageFieldReportElement;
027: import org.pentaho.reportdesigner.crm.report.model.PageDefinition;
028: import org.pentaho.reportdesigner.crm.report.model.PageFormatPreset;
029: import org.pentaho.reportdesigner.crm.report.model.PageOrientation;
030: import org.pentaho.reportdesigner.crm.report.model.Report;
031: import org.pentaho.reportdesigner.crm.report.model.ReportElement;
032: import org.pentaho.reportdesigner.crm.report.model.ReportFunctionElement;
033: import org.pentaho.reportdesigner.crm.report.model.ReportFunctionsElement;
034: import org.pentaho.reportdesigner.crm.report.model.ReportGroup;
035: import org.pentaho.reportdesigner.crm.report.model.ReportGroups;
036: import org.pentaho.reportdesigner.crm.report.model.TextFieldReportElement;
037: import org.pentaho.reportdesigner.crm.report.model.functions.ExpressionRegistry;
038: import org.pentaho.reportdesigner.crm.report.reportelementinfo.ReportElementInfoFactory;
039: import org.pentaho.reportdesigner.crm.report.wizard.WizardData;
040: import org.pentaho.reportdesigner.crm.report.wizard.reportgeneratewizard.GroupInfo;
041: import org.pentaho.reportdesigner.lib.client.i18n.TranslationManager;
042: import org.pentaho.reportdesigner.lib.client.util.DoubleDimension;
043: import org.pentaho.reportdesigner.lib.client.util.FontUtils;
044:
045: import javax.swing.*;
046: import java.awt.*;
047: import java.awt.geom.Point2D;
048: import java.lang.reflect.InvocationTargetException;
049: import java.util.ArrayList;
050: import java.util.HashMap;
051: import java.util.logging.Level;
052: import java.util.logging.Logger;
053:
054: /**
055: * User: Martin
056: * Date: 27.02.2006
057: * Time: 18:22:59
058: */
059: public class IndentedLayoutPlugin extends AbstractLayoutPlugin {
060: @NonNls
061: @NotNull
062: private static final Logger LOG = Logger
063: .getLogger(IndentedLayoutPlugin.class.getName());
064:
065: public IndentedLayoutPlugin() {
066: }
067:
068: @NotNull
069: public String getLocalizedName() {
070: return TranslationManager.getInstance().getTranslation("R",
071: "IndentedLayoutPlugin.Name");
072: }
073:
074: @NotNull
075: public ImageIcon getSampleImage() {
076: return IconLoader.getInstance().getTemplateIndentedIcon();
077: }
078:
079: public void addVisualReportElements(@NotNull
080: Report report, @NotNull
081: HashMap<String, WizardData> wizardDatas, @NotNull
082: LayoutStyle layoutStyle) throws LayoutException {
083: if (layoutStyle == null) {
084: throw new IllegalArgumentException(
085: "layoutStyle must not be null");
086: }
087:
088: @Nullable
089: WizardData visibleColumnInfoData = wizardDatas
090: .get(WizardData.VISIBLE_COLUMN_INFOS);
091: ArrayList<ColumnInfo> visibleColumnInfos = new ArrayList<ColumnInfo>();
092: if (visibleColumnInfoData != null) {
093: //noinspection unchecked
094: visibleColumnInfos = new ArrayList<ColumnInfo>(
095: (ArrayList<ColumnInfo>) visibleColumnInfoData
096: .getValue());
097: }
098:
099: @Nullable
100: WizardData columnGroupsWizardData = wizardDatas
101: .get(WizardData.COLUMN_GROUPS);
102: ArrayList<GroupInfo> columnGroups = new ArrayList<GroupInfo>();
103: if (columnGroupsWizardData != null) {
104: //noinspection unchecked
105: columnGroups = (ArrayList<GroupInfo>) columnGroupsWizardData
106: .getValue();
107: }
108:
109: @Nullable
110: WizardData pageDefinitionWizardData = wizardDatas
111: .get(WizardData.PAGE_DEFINITION);
112: PageDefinition pageDefinition;
113: if (pageDefinitionWizardData == null) {
114: pageDefinition = new PageDefinition(PageFormatPreset.A4,
115: PageOrientation.PORTRAIT, 20, 20, 20, 20);
116: } else {
117: pageDefinition = (PageDefinition) pageDefinitionWizardData
118: .getValue();
119: }
120:
121: double pageWidth = pageDefinition.getInnerPageSize().getWidth();
122:
123: BandToplevelReportElement reportHeaderBand = ReportElementInfoFactory
124: .getInstance().getBandToplevelReportElementInfo(
125: BandToplevelType.REPORT_HEADER)
126: .createReportElement();
127: LabelReportElement titleLabel = ReportElementInfoFactory
128: .getInstance().getLabelReportElementInfo()
129: .createReportElement();
130: titleLabel
131: .setText(TranslationManager.getInstance()
132: .getTranslation("R",
133: "IndentedLayoutPlugin.ReportTitle"));
134: titleLabel.setFont(FontUtils.getFont(layoutStyle
135: .getBaseFontName(), Font.BOLD, 26));
136: titleLabel.setMinimumSize(new DoubleDimension(pageWidth, 40));
137: reportHeaderBand.addChild(titleLabel);
138:
139: ReportGroups reportGroups = ReportElementInfoFactory
140: .getInstance().getReportGroupsElementInfo()
141: .createReportElement();
142: boolean addedToToplevelReportGroups = false;
143:
144: ReportGroup parentGroup = null;
145:
146: double tableHeaderPosition = 40 + 10;
147: BandToplevelReportElement tableHeaderBand = reportHeaderBand;
148:
149: double xStart = 0;
150:
151: for (int i = 0; i < columnGroups.size(); i++) {
152: GroupInfo columnInfo = columnGroups.get(i);
153: ReportGroup reportGroupElement = ReportElementInfoFactory
154: .getInstance().getReportGroupElementInfo()
155: .createReportElement();
156: ArrayList<String> groupFields = new ArrayList<String>();
157: StringBuilder sb = new StringBuilder(100);
158: for (ColumnInfo info : columnInfo.getColumnInfos()) {
159: groupFields.add(info.getColumnName());
160: sb.append(info.getColumnName());
161: sb.append("_");
162: }
163: reportGroupElement.setGroupFields(groupFields
164: .toArray(new String[groupFields.size()]));
165: reportGroupElement.setName(sb.toString() + "group");
166:
167: boolean visible = false;
168:
169: double yStart = 0;
170: double yEnd = 30;
171: double xEnd = pageWidth - xStart;
172:
173: int visibleColumnInfoCount = 0;
174:
175: for (int j = 0; j < columnInfo.getColumnInfos().size(); j++) {
176: ColumnInfo info = columnInfo.getColumnInfos().get(j);
177: if (visibleColumnInfos.contains(info)) {
178: visibleColumnInfoCount++;
179: }
180: }
181:
182: if (visibleColumnInfoCount > 0) {
183: visible = true;
184: int visibleIndex = 0;
185: for (int j = 0; j < columnInfo.getColumnInfos().size(); j++) {
186: ColumnInfo info = columnInfo.getColumnInfos()
187: .get(j);
188:
189: if (visibleColumnInfos.contains(info)) {
190: MessageFieldReportElement groupTitleLabel = ReportElementInfoFactory
191: .getInstance()
192: .getMessageFieldReportElementInfo()
193: .createReportElement();
194: groupTitleLabel.setFormatString(info
195: .getColumnName()
196: + ": $(" + info.getColumnName() + ")");
197: groupTitleLabel.setFont(FontUtils.getFont(
198: layoutStyle.getBaseFontName(),
199: Font.BOLD, 16));
200: if (layoutStyle.getBaseColor() != null) {
201: groupTitleLabel
202: .setBackground(getBackgroundColor(
203: layoutStyle.getBaseColor(),
204: columnGroups.size(), i));
205: }
206: groupTitleLabel
207: .setPosition(new Point2D.Double(xEnd
208: / visibleColumnInfoCount
209: * visibleIndex + xStart, yStart));
210: groupTitleLabel
211: .setMinimumSize(new DoubleDimension(
212: xEnd / visibleColumnInfoCount
213: - xStart, yEnd - yStart));
214: reportGroupElement.getGroupHeader().addChild(
215: groupTitleLabel);
216: reportGroupElement.getGroupHeader()
217: .setShowInLayoutGUI(true);
218: reportGroupElement.getGroupHeader().setRepeat(
219: true);
220:
221: visibleIndex++;
222: }
223: }
224: }
225:
226: if (!addedToToplevelReportGroups) {
227: reportGroups.addChild(reportGroupElement);
228: addedToToplevelReportGroups = true;
229: } else {
230: parentGroup.addChild(reportGroupElement);
231: }
232:
233: parentGroup = reportGroupElement;
234:
235: if (visible) {
236: tableHeaderPosition = yEnd;
237: } else {
238: tableHeaderPosition = yStart;
239: }
240: tableHeaderBand = reportGroupElement.getGroupHeader();
241:
242: xStart += pageWidth / visibleColumnInfos.size();
243: }
244:
245: visibleColumnInfos.removeAll(columnGroups);
246:
247: addTableHeader(xStart, tableHeaderPosition, pageWidth,
248: tableHeaderBand, visibleColumnInfos, columnGroups,
249: layoutStyle);
250:
251: BandToplevelReportElement itemBand = addItems(xStart,
252: pageWidth, visibleColumnInfos, columnGroups,
253: layoutStyle);
254:
255: //set up functions
256: BandToplevelReportElement reportFooter = ReportElementInfoFactory
257: .getInstance().getBandToplevelReportElementInfo(
258: BandToplevelType.REPORT_FOOTER)
259: .createReportElement();
260:
261: ReportFunctionsElement reportFunctions = ReportElementInfoFactory
262: .getInstance().getReportFunctionsElementInfo()
263: .createReportElement();
264:
265: @Nullable
266: WizardData expressionsWizardData = wizardDatas
267: .get(WizardData.COLUMN_EXPRESSIONS);
268: if (expressionsWizardData != null) {
269: //noinspection unchecked
270: HashMap<ColumnInfo, Class<?>> infos = (HashMap<ColumnInfo, Class<?>>) expressionsWizardData
271: .getValue();
272: for (ColumnInfo columnInfo : infos.keySet()) {
273: ArrayList<ReportElement> children = itemBand
274: .getChildren();
275: for (ReportElement reportElement : children) {
276: if (reportElement instanceof TextFieldReportElement) {
277: TextFieldReportElement textFieldReportElement = (TextFieldReportElement) reportElement;
278: if (textFieldReportElement.getFieldName()
279: .equals(columnInfo.getColumnName())) {
280: @Nullable
281: Class<?> expressionInfo = infos
282: .get(columnInfo);
283: ReportFunctionElement functionElement;
284: try {
285: functionElement = ExpressionRegistry
286: .getInstance()
287: .createWrapperInstance(
288: (Expression) expressionInfo
289: .newInstance());
290: } catch (InstantiationException e) {
291: throw new LayoutException(
292: "Expression not accessible", e);
293: } catch (IllegalAccessException e) {
294: throw new LayoutException(
295: "Expression not accessible", e);
296: }
297:
298: String name = functionElement
299: .getClass()
300: .getName()
301: .substring(
302: functionElement.getClass()
303: .getName()
304: .lastIndexOf('.') + 1);
305: functionElement.setName(name);
306: try {
307: String groupName = "default";//NON-NLS
308: if (parentGroup != null) {
309: groupName = parentGroup.getName();
310: }
311: functionElement.getClass().getMethod(
312: "setGroup", String.class)
313: .invoke(functionElement,
314: groupName);//NON-NLS
315: } catch (NoSuchMethodException e) {
316: if (LOG.isLoggable(Level.FINE))
317: LOG
318: .log(
319: Level.FINE,
320: "ReportFactory.createReport ",
321: e);
322: //ok
323: } catch (IllegalAccessException e) {
324: if (LOG.isLoggable(Level.FINE))
325: LOG
326: .log(
327: Level.FINE,
328: "StructuredLayoutPlugin.addVisualReportElements ",
329: e);
330: throw new LayoutException(
331: "Method not accessible", e);
332: } catch (InvocationTargetException e) {
333: if (LOG.isLoggable(Level.FINE))
334: LOG
335: .log(
336: Level.FINE,
337: "StructuredLayoutPlugin.addVisualReportElements ",
338: e);
339: throw new LayoutException(
340: "Unexpected error", e);
341: }
342:
343: try {
344: functionElement
345: .getClass()
346: .getMethod("setField",
347: String.class)
348: .invoke(
349: functionElement,
350: columnInfo
351: .getColumnName());//NON-NLS
352: } catch (NoSuchMethodException e) {
353: if (LOG.isLoggable(Level.FINE))
354: LOG
355: .log(
356: Level.FINE,
357: "ReportFactory.createReport ",
358: e);
359: //ok
360: } catch (IllegalAccessException e) {
361: if (LOG.isLoggable(Level.FINE))
362: LOG
363: .log(
364: Level.FINE,
365: "StructuredLayoutPlugin.addVisualReportElements ",
366: e);
367: throw new LayoutException(
368: "Method not accessible", e);
369: } catch (InvocationTargetException e) {
370: if (LOG.isLoggable(Level.FINE))
371: LOG
372: .log(
373: Level.FINE,
374: "StructuredLayoutPlugin.addVisualReportElements ",
375: e);
376: throw new LayoutException(
377: "Unexpected error", e);
378: }
379:
380: TextFieldReportElement columnValueTextField = ReportElementInfoFactory
381: .getInstance()
382: .getTextFieldReportElementInfo()
383: .createReportElement();
384: columnValueTextField.setFieldName(name);
385: columnValueTextField.setFont(FontUtils
386: .getFont(layoutStyle
387: .getBaseFontName(),
388: Font.PLAIN, 12));
389: if (layoutStyle.getBaseColor() != null) {
390: columnValueTextField
391: .setBackground(getBackgroundColor(
392: layoutStyle
393: .getBaseColor(),
394: columnGroups.size(),
395: columnGroups.size() + 2));
396: }
397: columnValueTextField
398: .setMinimumSize(new DoubleDimension(
399: textFieldReportElement
400: .getMinimumSize()
401: .getWidth(), 16));
402: double yOff = 0;
403: columnValueTextField
404: .setPosition(new Point2D.Double(
405: textFieldReportElement
406: .getPosition()
407: .getX(), yOff));
408:
409: if (parentGroup != null) {
410: parentGroup.getGroupFooter().addChild(
411: columnValueTextField);
412: parentGroup.getGroupFooter()
413: .setShowInLayoutGUI(true);
414: parentGroup
415: .getGroupFooter()
416: .setMinimumSize(
417: new DoubleDimension(
418: 0,
419: columnValueTextField
420: .getMinimumSize()
421: .getHeight() + 20));
422: } else {
423: reportFooter
424: .addChild(columnValueTextField);
425: }
426:
427: reportFunctions.addChild(functionElement);
428: }
429: }
430: }
431: }
432: }
433:
434: BandToplevelReportElement pageHeaderBand = ReportElementInfoFactory
435: .getInstance().getBandToplevelReportElementInfo(
436: BandToplevelType.PAGE_HEADER)
437: .createReportElement();
438: BandToplevelReportElement pageFooterBand = ReportElementInfoFactory
439: .getInstance().getBandToplevelReportElementInfo(
440: BandToplevelType.PAGE_FOOTER)
441: .createReportElement();
442:
443: composePageHeader(reportFunctions, pageWidth, pageHeaderBand);
444: composePageFooter(reportFunctions, pageWidth, pageFooterBand);
445:
446: report.addChild(reportFunctions);
447: report.addChild(reportHeaderBand);
448: report.addChild(reportFooter);
449: report.addChild(pageHeaderBand);
450: report.addChild(pageFooterBand);
451: report.addChild(itemBand);
452: report.addChild(ReportElementInfoFactory.getInstance()
453: .getBandToplevelReportElementInfo(
454: BandToplevelType.WATERMARK)
455: .createReportElement());
456: report.addChild(ReportElementInfoFactory.getInstance()
457: .getBandToplevelReportElementInfo(
458: BandToplevelType.NO_DATA_BAND)
459: .createReportElement());
460: report.addChild(reportGroups);
461: report.setPageDefinition(pageDefinition);
462:
463: tableHeaderBand.getVerticalLinealModel().addGuidLine(
464: new GuideLine(tableHeaderPosition, true));
465:
466: ArrayList<ColumnInfo> remainingCoumnInfos = new ArrayList<ColumnInfo>(
467: visibleColumnInfos);
468: for (GroupInfo groupInfo : columnGroups) {
469: remainingCoumnInfos.removeAll(groupInfo.getColumnInfos());
470: }
471:
472: for (int i = 1; i < remainingCoumnInfos.size(); i++) {
473: report.getHorizontalLinealModel().addGuidLine(
474: new GuideLine(pageWidth
475: / (double) remainingCoumnInfos.size() * i
476: + xStart, true));
477: }
478: }
479:
480: private void addTableHeader(double xStart,
481: double tableHeaderPosition, double pageWidth, @NotNull
482: BandToplevelReportElement tableHeaderBand, @NotNull
483: ArrayList<ColumnInfo> visibleColumnInfos, @NotNull
484: ArrayList<GroupInfo> columnGroups, @NotNull
485: LayoutStyle layoutStyle) {
486: ArrayList<ColumnInfo> remainingCoumnInfos = new ArrayList<ColumnInfo>(
487: visibleColumnInfos);
488: for (GroupInfo groupInfo : columnGroups) {
489: remainingCoumnInfos.removeAll(groupInfo.getColumnInfos());
490: }
491:
492: if (remainingCoumnInfos.isEmpty()) {
493: return;
494: }
495:
496: double columnWidth = (pageWidth - xStart)
497: / remainingCoumnInfos.size();
498:
499: for (ColumnInfo columnInfo : remainingCoumnInfos) {
500: LabelReportElement columnTitleLabel = ReportElementInfoFactory
501: .getInstance().getLabelReportElementInfo()
502: .createReportElement();
503: columnTitleLabel.setText(columnInfo.getColumnName());
504: columnTitleLabel.setFont(FontUtils.getFont(layoutStyle
505: .getBaseFontName(), Font.BOLD, 12));
506: Color baseColor = layoutStyle.getBaseColor();
507: if (baseColor != null) {
508: columnTitleLabel.setBackground(getBackgroundColor(
509: baseColor, columnGroups.size(), columnGroups
510: .size() + 1));
511: }
512: columnTitleLabel.setMinimumSize(new DoubleDimension(
513: columnWidth, 16));
514: columnTitleLabel.setPosition(new Point2D.Double(xStart,
515: tableHeaderPosition));
516: tableHeaderBand.addChild(columnTitleLabel);
517: tableHeaderBand.setShowInLayoutGUI(true);
518:
519: xStart += columnWidth;
520: }
521: }
522:
523: @NotNull
524: private BandToplevelReportElement addItems(double xStart,
525: double pageWidth, @NotNull
526: ArrayList<ColumnInfo> visibleColumnInfos, @NotNull
527: ArrayList<GroupInfo> columnGroups, @NotNull
528: LayoutStyle layoutStyle) {
529: ArrayList<ColumnInfo> remainingCoumnInfos = new ArrayList<ColumnInfo>(
530: visibleColumnInfos);
531: for (GroupInfo groupInfo : columnGroups) {
532: remainingCoumnInfos.removeAll(groupInfo.getColumnInfos());
533: }
534:
535: BandToplevelReportElement itemBand = ReportElementInfoFactory
536: .getInstance().getBandToplevelReportElementInfo(
537: BandToplevelType.ITEM_BAND)
538: .createReportElement();
539:
540: double columnWidth = (pageWidth - xStart)
541: / remainingCoumnInfos.size();
542: double tableHeaderPosition = 0;
543:
544: for (ColumnInfo columnInfo : remainingCoumnInfos) {
545: TextFieldReportElement columnValueTextField = ReportElementInfoFactory
546: .getInstance().getTextFieldReportElementInfo()
547: .createReportElement();
548: columnValueTextField.setFieldName(columnInfo
549: .getColumnName());
550: columnValueTextField.setFont(FontUtils.getFont(layoutStyle
551: .getBaseFontName(), Font.PLAIN, 12));
552: Color baseColor = layoutStyle.getBaseColor();
553: if (baseColor != null) {
554: columnValueTextField.setBackground(getBackgroundColor(
555: baseColor, columnGroups.size(), columnGroups
556: .size() + 2));
557: }
558: columnValueTextField.setMinimumSize(new DoubleDimension(
559: columnWidth, 16));
560: columnValueTextField.setPosition(new Point2D.Double(xStart,
561: tableHeaderPosition));
562: itemBand.addChild(columnValueTextField);
563:
564: xStart += columnWidth;
565: }
566: return itemBand;
567: }
568: }
|