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.properties;
015:
016: import com.jgoodies.forms.layout.CellConstraints;
017: import com.jgoodies.forms.layout.FormLayout;
018: import org.jetbrains.annotations.NonNls;
019: import org.jetbrains.annotations.NotNull;
020: import org.jetbrains.annotations.Nullable;
021: import org.jfree.report.function.Expression;
022: import org.pentaho.reportdesigner.crm.report.ReportDialog;
023: import org.pentaho.reportdesigner.crm.report.ReportElementSelectionModel;
024: import org.pentaho.reportdesigner.crm.report.UndoConstants;
025: import org.pentaho.reportdesigner.crm.report.model.Report;
026: import org.pentaho.reportdesigner.crm.report.model.ReportFunctionElement;
027: import org.pentaho.reportdesigner.crm.report.model.functions.ExpressionRegistry;
028: import org.pentaho.reportdesigner.lib.client.i18n.TranslationManager;
029: import org.pentaho.reportdesigner.lib.client.util.UncaughtExcpetionsModel;
030:
031: import javax.swing.*;
032: import javax.swing.event.TreeSelectionEvent;
033: import javax.swing.event.TreeSelectionListener;
034: import javax.swing.tree.DefaultMutableTreeNode;
035: import javax.swing.tree.DefaultTreeCellRenderer;
036: import javax.swing.tree.DefaultTreeModel;
037: import javax.swing.tree.TreePath;
038: import javax.swing.tree.TreeSelectionModel;
039: import java.awt.*;
040: import java.awt.event.ActionEvent;
041: import java.awt.event.ActionListener;
042: import java.util.ArrayList;
043: import java.util.Arrays;
044: import java.util.Collections;
045: import java.util.Comparator;
046: import java.util.HashMap;
047: import java.util.Set;
048: import java.util.logging.Level;
049: import java.util.logging.Logger;
050:
051: /**
052: * User: Martin
053: * Date: 10.01.2006
054: * Time: 14:50:30
055: */
056: public class ExpressionChooser extends JPanel {
057: @NonNls
058: @NotNull
059: private static final Logger LOG = Logger
060: .getLogger(ExpressionChooser.class.getName());
061:
062: @NotNull
063: private static final String ROOT = "root";
064:
065: @NotNull
066: private JTree expressionsTree;
067:
068: public ExpressionChooser(@NotNull
069: final ReportDialog reportDialog, @NotNull
070: final Report report, @NotNull
071: final ReportElementSelectionModel reportElementSelectionModel) {
072: DefaultMutableTreeNode root = new DefaultMutableTreeNode(ROOT);
073:
074: Set<Class<?>> classes = ExpressionRegistry.getInstance()
075: .getJFreeReportExpressionToWrapperClassesMap().keySet();
076: ArrayList<Class<?>> classesList = new ArrayList<Class<?>>(
077: classes);
078: Collections.sort(classesList, new Comparator<Class<?>>() {
079: public int compare(@NotNull
080: Class<?> o1, @NotNull
081: Class<?> o2) {
082: String functionName1 = ExpressionRegistry.getInstance()
083: .getLocalizedExpressionName(o1);
084: String functionName2 = ExpressionRegistry.getInstance()
085: .getLocalizedExpressionName(o2);
086: return functionName1.compareTo(functionName2);
087: }
088: });
089:
090: buildTree(root, classesList);
091:
092: DefaultTreeModel defaultTreeModel = new DefaultTreeModel(root);
093: expressionsTree = new JTree(defaultTreeModel);
094:
095: expressionsTree.setShowsRootHandles(true);
096:
097: expressionsTree.expandRow(0);
098:
099: expressionsTree.setCellRenderer(new DefaultTreeCellRenderer() {
100: @NotNull
101: public Component getTreeCellRendererComponent(@NotNull
102: JTree tree, @Nullable
103: Object value, boolean sel, boolean expanded, boolean leaf,
104: int row, boolean hasFocus) {
105: JLabel label = (JLabel) super
106: .getTreeCellRendererComponent(tree, value, sel,
107: expanded, leaf, row, hasFocus);
108: try {
109: DefaultMutableTreeNode defaultMutableTreeNode = (DefaultMutableTreeNode) value;
110: if (defaultMutableTreeNode != null) {
111: if (ROOT.equals(defaultMutableTreeNode
112: .getUserObject())) {
113: label
114: .setText(TranslationManager
115: .getInstance()
116: .getTranslation("R",
117: "ExpressionChooser.AvailableFunctionsLabel"));
118: label.setIcon(null);
119: } else if (defaultMutableTreeNode
120: .getUserObject() instanceof Class) {
121: Class<?> jFreeClass = (Class<?>) defaultMutableTreeNode
122: .getUserObject();
123: label.setText(ExpressionRegistry
124: .getInstance()
125: .getLocalizedExpressionName(
126: jFreeClass));
127: label.setIcon(null);
128: String text = TranslationManager
129: .getInstance()
130: .getTranslation(
131: "R",
132: "Expressions."
133: + jFreeClass
134: .getSimpleName()
135: + ".Description");
136: label.setToolTipText("<html>" + text
137: + "</html>");//NON-NLS
138: } else {
139: label.setIcon(null);
140: }
141: }
142: } catch (Throwable e) {
143: UncaughtExcpetionsModel.getInstance().addException(
144: e);
145: }
146:
147: return label;
148: }
149: });
150:
151: @NonNls
152: FormLayout formLayout = new FormLayout(
153: "0dlu, fill:default:grow, 0dlu",
154: "0dlu, fill:10dlu:grow, 4dlu, pref, 4dlu");
155: @NonNls
156: CellConstraints cc = new CellConstraints();
157:
158: setLayout(formLayout);
159:
160: add(new JScrollPane(expressionsTree), cc.xy(2, 2));
161:
162: final JButton addButton = new JButton(TranslationManager
163: .getInstance().getTranslation("R",
164: "ExpressionChooser.AddFunctionToReportButton"));
165: add(addButton, cc.xy(2, 4, "center, center"));
166:
167: ToolTipManager.sharedInstance().registerComponent(
168: expressionsTree);
169:
170: addButton.setEnabled(false);
171:
172: expressionsTree.getSelectionModel().setSelectionMode(
173: TreeSelectionModel.SINGLE_TREE_SELECTION);
174: expressionsTree
175: .addTreeSelectionListener(new TreeSelectionListener() {
176: public void valueChanged(@NotNull
177: TreeSelectionEvent e) {
178: TreePath selectionPath = expressionsTree
179: .getSelectionPath();
180: boolean b = selectionPath != null
181: && selectionPath.getLastPathComponent() instanceof DefaultMutableTreeNode
182: && ((DefaultMutableTreeNode) selectionPath
183: .getLastPathComponent())
184: .getUserObject() instanceof Class;
185: addButton.setEnabled(b);
186: }
187: });
188:
189: addButton.addActionListener(new ActionListener() {
190: public void actionPerformed(@NotNull
191: ActionEvent e) {
192: try {
193: reportDialog.getUndo().startTransaction(
194: UndoConstants.ADD_FUNCTION);
195: TreePath selectionPath = expressionsTree
196: .getSelectionPath();
197: Class<?> expressionInfo = (Class<?>) ((DefaultMutableTreeNode) selectionPath
198: .getLastPathComponent()).getUserObject();
199: Expression jFreeExpression = (Expression) expressionInfo
200: .newInstance();
201: jFreeExpression.setName("");
202: ReportFunctionElement reportElement = ExpressionRegistry
203: .getInstance().createWrapperInstance(
204: jFreeExpression);
205: report.getReportFunctions().addChild(reportElement);
206: reportElementSelectionModel.setSelection(Arrays
207: .asList(reportElement));
208: reportDialog.getUndo().endTransaction();
209: } catch (Exception e1) {
210: if (LOG.isLoggable(Level.FINE))
211: LOG.log(Level.FINE,
212: "ExpressionChooser.actionPerformed ",
213: e1);
214: UncaughtExcpetionsModel.getInstance().addException(
215: e1);
216: }
217: }
218: });
219: }
220:
221: private void buildTree(@NotNull
222: DefaultMutableTreeNode root, @NotNull
223: ArrayList<Class<?>> classesList) {
224: HashMap<String, DefaultMutableTreeNode> groups = new HashMap<String, DefaultMutableTreeNode>();
225: groups.put("", root);
226:
227: for (Class<?> aClass : classesList) {
228: String path = ExpressionRegistry.getInstance().getTreePath(
229: aClass);
230: if (groups.get(path) == null) {
231: String text = TranslationManager.getInstance()
232: .getTranslation("R", "TreeGroup." + path);
233: DefaultMutableTreeNode node = new DefaultMutableTreeNode(
234: text, true);
235: boolean inserted = false;
236: for (int i = 0; i < root.getChildCount(); i++) {
237: if (text.compareToIgnoreCase(root.getChildAt(i)
238: .toString()) < 0) {
239: root.insert(node, i);
240: inserted = true;
241: break;
242: }
243: }
244: if (!inserted) {
245: root.add(node);
246: }
247: groups.put(path, node);
248: }
249: }
250:
251: for (Class<?> aClass : classesList) {
252: String path = ExpressionRegistry.getInstance().getTreePath(
253: aClass);
254: DefaultMutableTreeNode parent = groups.get(path);
255: DefaultMutableTreeNode node = new DefaultMutableTreeNode(
256: aClass, false);
257: parent.add(node);
258: }
259: }
260:
261: }
|