001: /*
002: * BoxBorderEditorPanel.java
003: *
004: * Created on March 11, 2008, 2:56 PM
005: */
006:
007: package it.businesslogic.ireport.gui.box;
008:
009: import it.businesslogic.ireport.Box;
010: import it.businesslogic.ireport.Pen;
011: import it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side;
012: import it.businesslogic.ireport.gui.sheet.ColorSelectorPanel;
013: import java.awt.BorderLayout;
014: import java.awt.Color;
015: import java.awt.event.ActionEvent;
016: import java.awt.event.ActionListener;
017: import java.util.ArrayList;
018: import java.util.List;
019: import javax.swing.DefaultListModel;
020: import javax.swing.SpinnerNumberModel;
021: import javax.swing.UIManager;
022: import javax.swing.event.ChangeEvent;
023: import javax.swing.event.ChangeListener;
024: import javax.swing.event.ListSelectionEvent;
025: import javax.swing.event.ListSelectionListener;
026:
027: /**
028: *
029: * @author gtoffoli
030: */
031: public class BoxBorderEditorPanel extends javax.swing.JPanel implements
032: BorderSelectionListener {
033:
034: private BoxBorderSelectionPanel selectionPanel = null;
035: private Box box = null;
036: private SpinnerNumberModel spinnedModel = null;
037: private DefaultListModel styleListModel = null;
038: private ColorSelectorPanel colorSelector = null;
039:
040: private List<ActionListener> listeners = new ArrayList<ActionListener>();
041:
042: public void addActionPerformedListener(ActionListener listener) {
043: if (!listeners.contains(listener))
044: listeners.add(listener);
045: }
046:
047: public void removeActionPerformedListener(ActionListener listener) {
048: if (listeners.contains(listener))
049: listeners.remove(listener);
050: }
051:
052: private void fireActionPerformed() {
053: ActionEvent evt = new ActionEvent(this , 0, "pen");
054: for (ActionListener listener : listeners) {
055: listener.actionPerformed(evt);
056: }
057: }
058:
059: private boolean init = false;
060:
061: /** Creates new form BoxBorderEditorPanel */
062: public BoxBorderEditorPanel() {
063: initComponents();
064:
065: selectionPanel = new BoxBorderSelectionPanel();
066: selectionPanel.addBorderSelectionListener(this );
067: jPanelPreview.add(selectionPanel, BorderLayout.CENTER);
068:
069: colorSelector = new ColorSelectorPanel();
070: jPanelColorSelector.add(colorSelector, BorderLayout.CENTER);
071:
072: colorSelector.setColor(null);
073: colorSelector.addActionListener(new ActionListener() {
074:
075: public void actionPerformed(ActionEvent e) {
076: colorChanged();
077: }
078: });
079:
080: spinnedModel = new SpinnerNumberModel(1, 0, 100, 0.25);
081: jSpinnerLineWidth.setModel(spinnedModel);
082: spinnedModel.addChangeListener(new ChangeListener() {
083:
084: public void stateChanged(ChangeEvent e) {
085: widthChanged();
086: }
087: });
088:
089: jSpinnerLineWidth.setFont(UIManager.getFont("TextField.font"));
090:
091: jList1.setCellRenderer(new LineStyleListCellRenderer());
092: styleListModel = new DefaultListModel();
093: jList1.setModel(styleListModel);
094:
095: //styleListModel.addElement("");
096: styleListModel.addElement("Solid");
097: styleListModel.addElement("Dashed");
098: styleListModel.addElement("Dotted");
099: styleListModel.addElement("Double");
100:
101: jList1.getSelectionModel().addListSelectionListener(
102: new ListSelectionListener() {
103:
104: public void valueChanged(ListSelectionEvent e) {
105: lineStyleChanged();
106: }
107: });
108:
109: }
110:
111: public void selectionChanged(List<Side> selectedBorders) {
112: if (isInit() || box == null)
113: return;
114:
115: setInit(true);
116:
117: boolean sameWidth = true;
118: boolean sameStyle = true;
119: boolean sameColor = true;
120:
121: boolean first = true;
122:
123: // Reset all...
124: spinnedModel.setValue(0.0);
125: colorSelector.setColor(null);
126: jList1.clearSelection();
127:
128: if (selectedBorders.size() == 0) {
129: if (getBox() != null && getBox().getPen() != null) {
130: Pen pen = getBox().getPen();
131: spinnedModel.setValue(pen.getLineWidth());
132: colorSelector.setColor(pen.getLineColor());
133: if (pen.getLineStyle() != null) {
134: jList1.setSelectedValue(pen.getLineStyle(), true);
135: }
136: }
137: }
138:
139: for (it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side s : selectedBorders) {
140: Pen pen = null;
141: if (getBox() != null) {
142: switch (s) {
143: case TOP:
144: pen = getBox().getTopPen();
145: break;
146: case BOTTOM:
147: pen = getBox().getBottomPen();
148: break;
149: case RIGHT:
150: pen = getBox().getRightPen();
151: break;
152: case LEFT:
153: pen = getBox().getLeftPen();
154: break;
155: }
156: }
157:
158: if (pen != null) {
159: if (first) {
160: spinnedModel.setValue(pen.getLineWidth());
161: colorSelector.setColor(pen.getLineColor());
162: if (pen.getLineStyle() != null) {
163: jList1.setSelectedValue(pen.getLineStyle(),
164: true);
165: }
166: } else {
167: if (sameWidth) {
168: if (pen.getLineWidth() != spinnedModel
169: .getNumber().floatValue()) {
170: sameWidth = false;
171: // Keep the first value...
172: }
173: }
174:
175: if (sameColor) {
176: if (pen.getLineColor() == null
177: || !pen.getLineColor().equals(
178: colorSelector.getColor())) {
179: sameColor = false;
180: colorSelector.setColor(null);
181: }
182: }
183:
184: if (sameStyle) {
185: String ss = jList1.getSelectedValue() + "";
186: if (pen.getLineStyle() == null
187: || !pen.getLineStyle().equals(ss)) {
188: sameStyle = false;
189: jList1.clearSelection();
190: }
191: }
192:
193: }
194: first = false;
195: }
196:
197: }
198:
199: setInit(false);
200:
201: }
202:
203: public void widthChanged() {
204:
205: if (isInit() || box == null)
206: return;
207:
208: List<Side> borders = new ArrayList<Side>();
209: borders.addAll(selectionPanel.getSelectedBorders());
210:
211: if (borders.size() == 0) {
212: if (box.getPen() == null)
213: box.setPen(new Pen());
214: Pen pen = box.getPen();
215: pen.setLineWidth(spinnedModel.getNumber().floatValue());
216: borders.add(Side.TOP);
217: borders.add(Side.BOTTOM);
218: borders.add(Side.LEFT);
219: borders.add(Side.RIGHT);
220: }
221:
222: for (it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side s : borders) {
223: switch (s) {
224: case TOP: {
225: if (box.getTopPen() == null)
226: box.setTopPen(new Pen());
227: Pen pen = box.getTopPen();
228: pen.setLineWidth(spinnedModel.getNumber().floatValue());
229: break;
230: }
231: case LEFT: {
232: if (box.getLeftPen() == null)
233: box.setLeftPen(new Pen());
234: Pen pen = box.getLeftPen();
235: pen.setLineWidth(spinnedModel.getNumber().floatValue());
236: break;
237: }
238: case BOTTOM: {
239: if (box.getBottomPen() == null)
240: box.setBottomPen(new Pen());
241: Pen pen = box.getBottomPen();
242: pen.setLineWidth(spinnedModel.getNumber().floatValue());
243: break;
244: }
245: case RIGHT: {
246: if (box.getRightPen() == null)
247: box.setRightPen(new Pen());
248: Pen pen = box.getRightPen();
249: pen.setLineWidth(spinnedModel.getNumber().floatValue());
250: break;
251: }
252: }
253: }
254:
255: this .getSelectionPanel().repaint();
256: fireActionPerformed();
257: }
258:
259: public void colorChanged() {
260:
261: if (isInit() || box == null)
262: return;
263:
264: Color color = colorSelector.getColor();
265:
266: List<Side> borders = new ArrayList<Side>();
267: borders.addAll(selectionPanel.getSelectedBorders());
268:
269: if (borders.size() == 0) {
270: if (box.getPen() == null && color != null)
271: box.setPen(new Pen());
272: Pen pen = box.getPen();
273: if (pen != null)
274: pen.setLineColor(color);
275: borders.add(Side.TOP);
276: borders.add(Side.BOTTOM);
277: borders.add(Side.LEFT);
278: borders.add(Side.RIGHT);
279: }
280:
281: for (it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side s : borders) {
282: switch (s) {
283: case TOP: {
284: if (box.getTopPen() == null && color != null)
285: box.setTopPen(new Pen());
286: Pen pen = box.getTopPen();
287: if (pen != null)
288: pen.setLineColor(color);
289: break;
290: }
291: case LEFT: {
292: if (box.getLeftPen() == null && color != null)
293: box.setLeftPen(new Pen());
294: Pen pen = box.getLeftPen();
295: if (pen != null)
296: pen.setLineColor(color);
297: break;
298: }
299: case BOTTOM: {
300: if (box.getBottomPen() == null && color != null)
301: box.setBottomPen(new Pen());
302: Pen pen = box.getBottomPen();
303: if (pen != null)
304: pen.setLineColor(color);
305: break;
306: }
307: case RIGHT: {
308: if (box.getRightPen() == null && color != null)
309: box.setRightPen(new Pen());
310: Pen pen = box.getRightPen();
311: if (pen != null)
312: pen.setLineColor(color);
313: break;
314: }
315: }
316: }
317:
318: this .getSelectionPanel().repaint();
319: fireActionPerformed();
320: }
321:
322: public void lineStyleChanged() {
323:
324: if (isInit() || box == null)
325: return;
326:
327: String style = null;
328: if (jList1.getSelectedIndex() >= 0) {
329: style = (String) jList1.getSelectedValue();
330: }
331:
332: List<Side> borders = new ArrayList<Side>();
333: borders.addAll(selectionPanel.getSelectedBorders());
334:
335: if (borders.size() == 0) {
336: if (box.getPen() == null)
337: box.setPen(new Pen());
338: Pen pen = box.getPen();
339: pen.setLineStyle(style);
340: borders.add(Side.TOP);
341: borders.add(Side.BOTTOM);
342: borders.add(Side.LEFT);
343: borders.add(Side.RIGHT);
344: }
345:
346: for (it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side s : borders) {
347: switch (s) {
348: case TOP: {
349: if (box.getTopPen() == null)
350: box.setTopPen(new Pen());
351: Pen pen = box.getTopPen();
352: pen.setLineStyle(style);
353: break;
354: }
355: case LEFT: {
356: if (box.getLeftPen() == null)
357: box.setLeftPen(new Pen());
358: Pen pen = box.getLeftPen();
359: pen.setLineStyle(style);
360: break;
361: }
362: case BOTTOM: {
363: if (box.getBottomPen() == null)
364: box.setBottomPen(new Pen());
365: Pen pen = box.getBottomPen();
366: pen.setLineStyle(style);
367: break;
368: }
369: case RIGHT: {
370: if (box.getRightPen() == null)
371: box.setRightPen(new Pen());
372: Pen pen = box.getRightPen();
373: pen.setLineStyle(style);
374: break;
375: }
376: }
377: }
378:
379: this .getSelectionPanel().repaint();
380: fireActionPerformed();
381: }
382:
383: /** This method is called from within the constructor to
384: * initialize the form.
385: * WARNING: Do NOT modify this code. The content of this method is
386: * always regenerated by the Form Editor.
387: */
388: // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
389: private void initComponents() {
390: java.awt.GridBagConstraints gridBagConstraints;
391:
392: jPanel1 = new javax.swing.JPanel();
393: jPanelPreview = new javax.swing.JPanel();
394: jButton1 = new javax.swing.JButton();
395: jPanel2 = new javax.swing.JPanel();
396: jLabel1 = new javax.swing.JLabel();
397: jSpinnerLineWidth = new javax.swing.JSpinner();
398: jLabel3 = new javax.swing.JLabel();
399: jScrollPane1 = new javax.swing.JScrollPane();
400: jList1 = new javax.swing.JList();
401: jLabel2 = new javax.swing.JLabel();
402: jPanelColorSelector = new javax.swing.JPanel();
403: jPanel4 = new javax.swing.JPanel();
404:
405: setLayout(new java.awt.GridBagLayout());
406:
407: jPanel1.setLayout(new java.awt.GridBagLayout());
408:
409: jPanelPreview
410: .setBorder(javax.swing.BorderFactory
411: .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
412: jPanelPreview.setMinimumSize(new java.awt.Dimension(120, 80));
413: jPanelPreview.setPreferredSize(new java.awt.Dimension(120, 80));
414: jPanelPreview.setLayout(new java.awt.BorderLayout());
415: gridBagConstraints = new java.awt.GridBagConstraints();
416: gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
417: gridBagConstraints.insets = new java.awt.Insets(8, 4, 4, 4);
418: jPanel1.add(jPanelPreview, gridBagConstraints);
419:
420: jButton1.setText("Restore defaults");
421: jButton1.addActionListener(new java.awt.event.ActionListener() {
422: public void actionPerformed(java.awt.event.ActionEvent evt) {
423: jButton1ActionPerformed(evt);
424: }
425: });
426: gridBagConstraints = new java.awt.GridBagConstraints();
427: gridBagConstraints.gridx = 0;
428: gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
429: gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
430: jPanel1.add(jButton1, gridBagConstraints);
431:
432: gridBagConstraints = new java.awt.GridBagConstraints();
433: gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
434: add(jPanel1, gridBagConstraints);
435:
436: jPanel2.setMinimumSize(new java.awt.Dimension(200, 150));
437: jPanel2.setPreferredSize(new java.awt.Dimension(200, 150));
438: jPanel2.setLayout(new java.awt.GridBagLayout());
439:
440: jLabel1.setText("Line width");
441: gridBagConstraints = new java.awt.GridBagConstraints();
442: gridBagConstraints.insets = new java.awt.Insets(8, 4, 4, 4);
443: jPanel2.add(jLabel1, gridBagConstraints);
444:
445: jSpinnerLineWidth
446: .setMinimumSize(new java.awt.Dimension(120, 20));
447: jSpinnerLineWidth.setPreferredSize(new java.awt.Dimension(120,
448: 20));
449: gridBagConstraints = new java.awt.GridBagConstraints();
450: gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
451: gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
452: gridBagConstraints.weightx = 1.0;
453: gridBagConstraints.insets = new java.awt.Insets(8, 0, 0, 8);
454: jPanel2.add(jSpinnerLineWidth, gridBagConstraints);
455:
456: jLabel3.setText("Line Style");
457: gridBagConstraints = new java.awt.GridBagConstraints();
458: gridBagConstraints.gridy = 1;
459: gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
460: gridBagConstraints.insets = new java.awt.Insets(8, 4, 4, 4);
461: jPanel2.add(jLabel3, gridBagConstraints);
462:
463: jScrollPane1.setMinimumSize(new java.awt.Dimension(120, 80));
464: jScrollPane1.setPreferredSize(new java.awt.Dimension(120, 80));
465:
466: jList1
467: .setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
468: jScrollPane1.setViewportView(jList1);
469:
470: gridBagConstraints = new java.awt.GridBagConstraints();
471: gridBagConstraints.gridx = 1;
472: gridBagConstraints.gridy = 1;
473: gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
474: gridBagConstraints.insets = new java.awt.Insets(8, 0, 0, 8);
475: jPanel2.add(jScrollPane1, gridBagConstraints);
476:
477: jLabel2.setText("Line color");
478: gridBagConstraints = new java.awt.GridBagConstraints();
479: gridBagConstraints.gridy = 2;
480: gridBagConstraints.insets = new java.awt.Insets(8, 4, 4, 4);
481: jPanel2.add(jLabel2, gridBagConstraints);
482:
483: jPanelColorSelector.setBackground(new java.awt.Color(255, 255,
484: 255));
485: jPanelColorSelector.setBorder(javax.swing.BorderFactory
486: .createLineBorder(java.awt.SystemColor.controlShadow));
487: jPanelColorSelector.setMinimumSize(new java.awt.Dimension(50,
488: 20));
489: jPanelColorSelector.setPreferredSize(new java.awt.Dimension(
490: 120, 20));
491: jPanelColorSelector.setLayout(new java.awt.BorderLayout());
492: gridBagConstraints = new java.awt.GridBagConstraints();
493: gridBagConstraints.gridy = 2;
494: gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
495: gridBagConstraints.insets = new java.awt.Insets(8, 0, 0, 8);
496: jPanel2.add(jPanelColorSelector, gridBagConstraints);
497:
498: jPanel4.setLayout(null);
499: gridBagConstraints = new java.awt.GridBagConstraints();
500: gridBagConstraints.gridy = 100;
501: gridBagConstraints.weighty = 1.0;
502: jPanel2.add(jPanel4, gridBagConstraints);
503:
504: gridBagConstraints = new java.awt.GridBagConstraints();
505: gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
506: gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
507: gridBagConstraints.weightx = 1.0;
508: gridBagConstraints.weighty = 1.0;
509: add(jPanel2, gridBagConstraints);
510: }// </editor-fold>//GEN-END:initComponents
511:
512: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
513:
514: if (box == null)
515: return;
516:
517: List<Side> borders = new ArrayList<Side>();
518: borders.addAll(selectionPanel.getSelectedBorders());
519:
520: if (borders.size() == 0) {
521: box.setPen(null);
522: borders.add(Side.TOP);
523: borders.add(Side.BOTTOM);
524: borders.add(Side.LEFT);
525: borders.add(Side.RIGHT);
526: }
527: for (it.businesslogic.ireport.gui.box.BoxBorderSelectionPanel.Side s : borders) {
528: switch (s) {
529: case TOP: {
530: box.setTopPen(null);
531: break;
532: }
533: case LEFT: {
534: box.setLeftPen(null);
535: break;
536: }
537: case BOTTOM: {
538: box.setBottomPen(null);
539: break;
540: }
541: case RIGHT: {
542: box.setRightPen(null);
543: break;
544: }
545: }
546: }
547:
548: selectionChanged(borders);
549: getSelectionPanel().repaint();
550: fireActionPerformed();
551:
552: }//GEN-LAST:event_jButton1ActionPerformed
553:
554: // Variables declaration - do not modify//GEN-BEGIN:variables
555: private javax.swing.JButton jButton1;
556: private javax.swing.JLabel jLabel1;
557: private javax.swing.JLabel jLabel2;
558: private javax.swing.JLabel jLabel3;
559: private javax.swing.JList jList1;
560: private javax.swing.JPanel jPanel1;
561: private javax.swing.JPanel jPanel2;
562: private javax.swing.JPanel jPanel4;
563: private javax.swing.JPanel jPanelColorSelector;
564: private javax.swing.JPanel jPanelPreview;
565: private javax.swing.JScrollPane jScrollPane1;
566: private javax.swing.JSpinner jSpinnerLineWidth;
567:
568: // End of variables declaration//GEN-END:variables
569:
570: public BoxBorderSelectionPanel getSelectionPanel() {
571: return selectionPanel;
572: }
573:
574: public void setSelectionPanel(BoxBorderSelectionPanel selectionPanel) {
575: this .selectionPanel = selectionPanel;
576: }
577:
578: public Box getBox() {
579: return box;
580: }
581:
582: public void setBox(Box box) {
583:
584: boolean oldInit = isInit();
585: setInit(true);
586: this .box = box;
587: setInit(oldInit);
588: getSelectionPanel().clearSelection();
589: getSelectionPanel().setBox(box);
590: getSelectionPanel().repaint();
591: }
592:
593: public boolean isInit() {
594: return init;
595: }
596:
597: public void setInit(boolean init) {
598: this.init = init;
599: }
600:
601: }
|