| 1 24 25 package com.izforge.izpack.panels; 26 27 import java.awt.Color ; 28 import java.awt.Component ; 29 import java.awt.Dimension ; 30 import java.awt.GridBagConstraints ; 31 import java.awt.GridBagLayout ; 32 import java.awt.event.ActionEvent ; 33 import java.awt.event.ActionListener ; 34 import java.io.File ; 35 import java.io.InputStream ; 36 import java.util.HashMap ; 37 import java.util.Iterator ; 38 import java.util.List ; 39 import java.util.Map ; 40 41 import javax.swing.AbstractCellEditor ; 42 import javax.swing.BorderFactory ; 43 import javax.swing.Box ; 44 import javax.swing.BoxLayout ; 45 import javax.swing.JCheckBox ; 46 import javax.swing.JLabel ; 47 import javax.swing.JOptionPane ; 48 import javax.swing.JPanel ; 49 import javax.swing.JScrollPane ; 50 import javax.swing.JTable ; 51 import javax.swing.JTextArea ; 52 import javax.swing.ListSelectionModel ; 53 import javax.swing.border.Border ; 54 import javax.swing.event.ListSelectionEvent ; 55 import javax.swing.event.ListSelectionListener ; 56 import javax.swing.table.DefaultTableCellRenderer ; 57 import javax.swing.table.TableCellEditor ; 58 import javax.swing.table.TableCellRenderer ; 59 60 import net.n3.nanoxml.XMLElement; 61 62 import com.izforge.izpack.LocaleDatabase; 63 import com.izforge.izpack.Pack; 64 import com.izforge.izpack.gui.LabelFactory; 65 import com.izforge.izpack.installer.InstallData; 66 import com.izforge.izpack.installer.InstallerFrame; 67 import com.izforge.izpack.installer.IzPanel; 68 import com.izforge.izpack.installer.ResourceManager; 69 import com.izforge.izpack.util.Debug; 70 import com.izforge.izpack.util.IoHelper; 71 import com.izforge.izpack.util.VariableSubstitutor; 72 73 83 public abstract class PacksPanelBase extends IzPanel implements PacksPanelInterface, 84 ListSelectionListener  85 { 86 87 91 protected JLabel freeSpaceLabel; 92 93 96 protected JLabel spaceLabel; 97 98 101 protected JTextArea descriptionArea; 102 103 106 protected JTextArea dependencyArea; 107 108 111 protected JTable packsTable; 112 113 116 protected JScrollPane tableScroller; 117 118 122 private Map names; 123 124 127 protected int bytes = 0; 128 129 132 protected long freeBytes = 0; 133 134 137 protected boolean dependenciesExist = false; 138 139 142 private LocaleDatabase langpack = null; 143 144 147 private static final String LANG_FILE_NAME = "packsLang.xml"; 148 149 155 public PacksPanelBase(InstallerFrame parent, InstallData idata) 156 { 157 super(parent, idata); 158 try 160 { 161 this.langpack = parent.langpack; 162 InputStream inputStream = ResourceManager.getInstance().getInputStream(LANG_FILE_NAME); 163 this.langpack.add(inputStream); 164 } 165 catch (Throwable exception) 166 { 167 Debug.trace(exception); 168 } 169 computePacks(idata.availablePacks); 171 172 createNormalLayout(); 173 } 174 175 178 abstract protected void createNormalLayout(); 179 180 185 public LocaleDatabase getLangpack() 186 { 187 return (langpack); 188 } 189 190 195 public int getBytes() 196 { 197 return (bytes); 198 } 199 200 205 public void setBytes(int bytes) 206 { 207 this.bytes = bytes; 208 } 209 210 215 public void showSpaceRequired() 216 { 217 if (spaceLabel != null) spaceLabel.setText(Pack.toByteUnitsString(bytes)); 218 } 219 220 225 public void showFreeSpace() 226 { 227 if (IoHelper.supported("getFreeSpace") && freeSpaceLabel != null) 228 { 229 String msg = null; 230 freeBytes = IoHelper.getFreeSpace(IoHelper.existingParent( 231 new File (idata.getInstallPath())).getAbsolutePath()); 232 if (freeBytes < 0) 233 msg = parent.langpack.getString("PacksPanel.notAscertainable"); 234 else 235 msg = Pack.toByteUnitsString(freeBytes); 236 freeSpaceLabel.setText(msg); 237 } 238 } 239 240 245 public boolean isValidated() 246 { 247 if (IoHelper.supported("getFreeSpace") && freeBytes >= 0 && freeBytes <= bytes) 248 { 249 JOptionPane.showMessageDialog(this, parent.langpack 250 .getString("PacksPanel.notEnoughSpace"), parent.langpack 251 .getString("installer.error"), JOptionPane.ERROR_MESSAGE); 252 return (false); 253 } 254 return (true); 255 } 256 257 262 public void makeXMLData(XMLElement panelRoot) 263 { 264 new ImgPacksPanelAutomationHelper().makeXMLData(idata, panelRoot); 265 } 266 267 272 public void valueChanged(ListSelectionEvent e) 273 { 274 VariableSubstitutor vs = new VariableSubstitutor(idata.getVariables()); 275 276 int i = packsTable.getSelectedRow(); 277 if (i < 0) return; 278 if (descriptionArea != null) 280 { 281 Pack pack = (Pack) idata.availablePacks.get(i); 282 String desc = ""; 283 String key = pack.id + ".description"; 284 if (langpack != null && pack.id != null && !"".equals(pack.id)) 285 { 286 desc = langpack.getString(key); 287 } 288 if ("".equals(desc) || key.equals(desc)) 289 { 290 desc = pack.description; 291 } 292 desc = vs.substitute(desc, null); 293 descriptionArea.setText(desc); 294 } 295 if (dependencyArea != null) 297 { 298 Pack pack = (Pack) idata.availablePacks.get(i); 299 List dep = pack.dependencies; 300 String list = ""; 301 if (dep != null) 302 { 303 list += (langpack == null) ? "Dependencies: " : langpack 304 .getString("PacksPanel.dependencies"); 305 } 306 for (int j = 0; dep != null && j < dep.size(); j++) 307 { 308 String name = (String ) dep.get(j); 309 list += getI18NPackName((Pack) names.get(name)); 310 if (j != dep.size() - 1) list += ", "; 311 } 312 313 String excludeslist = (langpack == null) ? "Excludes: " : langpack 315 .getString("PacksPanel.excludes"); 316 int numexcludes = 0; 317 if (pack.excludeGroup != null) 318 { 319 for (int q = 0; q < idata.availablePacks.size(); q++) 320 { 321 Pack otherpack = (Pack) idata.availablePacks.get(q); 322 String exgroup = otherpack.excludeGroup; 323 if (exgroup != null) 324 { 325 if (q != i && pack.excludeGroup.equals(exgroup)) 326 { 327 328 excludeslist += getI18NPackName(otherpack) + ", "; 329 numexcludes++; 330 } 331 } 332 } 333 } 334 if (dep != null) excludeslist = " " + excludeslist; 336 if (numexcludes > 0) list += excludeslist; 337 if (list.endsWith(", ")) list = list.substring(0, list.length() - 2); 338 339 dependencyArea.setText(list); 341 } 342 } 343 344 351 private String getI18NPackName(Pack pack) 352 { 353 String packName = pack.name; 355 String key = pack.id; 356 if (langpack != null && pack.id != null && !"".equals(pack.id)) 357 { 358 packName = langpack.getString(key); 359 } 360 if ("".equals(packName) || key.equals(packName)) 361 { 362 packName = pack.name; 363 } 364 return (packName); 365 } 366 367 379 protected JLabel createLabel(String msgId, String iconId, GridBagLayout layout, 380 GridBagConstraints constraints) 381 { 382 JLabel label = LabelFactory.create(parent.langpack.getString(msgId), parent.icons 383 .getImageIcon(iconId), TRAILING); 384 if (layout != null && constraints != null) layout.addLayoutComponent(label, constraints); 385 add(label); 386 return (label); 387 } 388 389 400 protected JLabel createPanelWithLabel(String msgId, GridBagLayout layout, 401 GridBagConstraints constraints) 402 { 403 JPanel panel = new JPanel (); 404 JLabel label = new JLabel (); 405 if (label == null) label = new JLabel (""); 406 panel.setAlignmentX(LEFT_ALIGNMENT); 407 panel.setLayout(new BoxLayout (panel, BoxLayout.X_AXIS)); 408 panel.add(LabelFactory.create(parent.langpack.getString(msgId))); 409 panel.add(Box.createHorizontalGlue()); 410 panel.add(label); 411 if (layout != null && constraints != null) layout.addLayoutComponent(panel, constraints); 412 add(panel); 413 return (label); 414 } 415 416 429 protected JTextArea createTextArea(String msgId, JScrollPane scroller, GridBagLayout layout, 430 GridBagConstraints constraints) 431 { 432 JTextArea area = new JTextArea (); 433 area.setAlignmentX(LEFT_ALIGNMENT); 435 area.setCaretPosition(0); 436 area.setEditable(false); 437 area.setEditable(false); 438 area.setOpaque(false); 439 area.setLineWrap(true); 440 area.setWrapStyleWord(true); 441 area.setBorder(BorderFactory.createTitledBorder(parent.langpack.getString(msgId))); 442 area.setFont(getControlTextFont()); 443 444 if (layout != null && constraints != null) 445 { 446 if (scroller != null) 447 { 448 layout.addLayoutComponent(scroller, constraints); 449 } 450 else 451 layout.addLayoutComponent(area, constraints); 452 } 453 if (scroller != null) 454 { 455 scroller.setViewportView(area); 456 add(scroller); 457 } 458 else 459 add(area); 460 return (area); 461 462 } 463 464 473 protected JTable createPacksTable(int width, JScrollPane scroller, GridBagLayout layout, 474 GridBagConstraints constraints) 475 { 476 477 JTable table = new JTable (); 478 table.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2)); 479 table.setIntercellSpacing(new Dimension (0, 0)); 480 table.setBackground(Color.white); 481 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 482 table.getSelectionModel().addListSelectionListener(this); 483 table.setShowGrid(false); 484 scroller.setViewportView(table); 485 scroller.setAlignmentX(LEFT_ALIGNMENT); 486 scroller.getViewport().setBackground(Color.white); 487 scroller.setPreferredSize(new Dimension (width, (idata.guiPrefs.height / 3 + 30))); 488 489 if (layout != null && constraints != null) 490 layout.addLayoutComponent(scroller, constraints); 491 add(scroller); 492 return (table); 493 } 494 495 500 private void computePacks(List packs) 501 { 502 names = new HashMap (); 503 dependenciesExist = false; 504 for (int i = 0; i < packs.size(); i++) 505 { 506 Pack pack = (Pack) packs.get(i); 507 names.put(pack.name, pack); 508 if (pack.dependencies != null || pack.excludeGroup != null) dependenciesExist = true; 509 } 510 } 511 512 516 public void panelActivate() 517 { 518 try 519 { 520 521 packsTable.setModel(new PacksModel(this, idata, this.parent.getRules())); 522 CheckBoxEditorRenderer packSelectedRenderer = new CheckBoxEditorRenderer(false); 523 packsTable.getColumnModel().getColumn(0).setCellRenderer(packSelectedRenderer); 524 CheckBoxEditorRenderer packSelectedEditor = new CheckBoxEditorRenderer(true); 525 packsTable.getColumnModel().getColumn(0).setCellEditor(packSelectedEditor); 526 packsTable.getColumnModel().getColumn(0).setMaxWidth(40); 527 528 packsTable.getColumnModel().getColumn(1).setCellRenderer(new PacksPanelTableCellRenderer()); 530 PacksPanelTableCellRenderer renderer2 = new PacksPanelTableCellRenderer(); 531 renderer2.setHorizontalAlignment(RIGHT); 532 packsTable.getColumnModel().getColumn(2).setCellRenderer(renderer2); 533 packsTable.getColumnModel().getColumn(2).setMaxWidth(100); 534 535 tableScroller.remove(packsTable.getTableHeader()); 537 tableScroller.setColumnHeaderView(null); 538 tableScroller.setColumnHeader(null); 539 540 java.util.Iterator iter = idata.availablePacks.iterator(); 543 bytes = 0; 544 while (iter.hasNext()) 545 { 546 Pack p = (Pack) iter.next(); 547 if (p.required) 548 { 549 bytes += p.nbytes; 550 continue; 551 } 552 if (idata.selectedPacks.contains(p)) bytes += p.nbytes; 553 } 554 } 555 catch (Exception e) 556 { 557 e.printStackTrace(); 558 } 559 showSpaceRequired(); 560 showFreeSpace(); 561 } 562 563 568 public String getSummaryBody() 569 { 570 StringBuffer retval = new StringBuffer (256); 571 Iterator iter = idata.selectedPacks.iterator(); 572 boolean first = true; 573 while (iter.hasNext()) 574 { 575 if (!first) 576 { 577 retval.append("<br>"); 578 } 579 first = false; 580 Pack pack = (Pack) iter.next(); 581 if (langpack != null && pack.id != null && !"".equals(pack.id)) 582 { 583 retval.append(langpack.getString(pack.id)); 584 } 585 else 586 retval.append(pack.name); 587 } 588 return (retval.toString()); 589 } 590 591 static class CheckBoxEditorRenderer extends AbstractCellEditor implements TableCellRenderer , 592 TableCellEditor , ActionListener  593 { 594 595 598 private static final long serialVersionUID = 4049072731222061879L; 599 600 private JCheckBox display; 601 602 608 public CheckBoxEditorRenderer(boolean useAsEditor) 609 { 610 display = new JCheckBox (); 611 display.setHorizontalAlignment(CENTER); 612 if (useAsEditor) display.addActionListener(this); 613 614 } 615 616 public Component getTableCellRendererComponent(JTable table, Object value, 617 boolean isSelected, boolean hasFocus, int row, int column) 618 { 619 if (isSelected) 620 { 621 display.setForeground(table.getSelectionForeground()); 622 display.setBackground(table.getSelectionBackground()); 623 } 624 else 625 { 626 display.setForeground(table.getForeground()); 627 display.setBackground(table.getBackground()); 628 } 629 int state = ((Integer ) value).intValue(); 630 if (state == -2) 631 { 632 display.setForeground(Color.GRAY); 634 } 635 display.setSelected((value != null && Math.abs(state) == 1)); 636 display.setEnabled(state >= 0); 637 return display; 638 } 639 640 644 public Component getTableCellEditorComponent(JTable table, Object value, 645 boolean isSelected, int row, int column) 646 { 647 return getTableCellRendererComponent(table, value, isSelected, false, row, column); 648 } 649 650 public Object getCellEditorValue() 651 { 652 return new Integer (display.isSelected() ? 1 : 0); 653 } 654 655 public void actionPerformed(ActionEvent e) 656 { 657 stopCellEditing(); 658 } 659 } 660 661 static class PacksPanelTableCellRenderer extends DefaultTableCellRenderer  662 { 663 664 665 public Component getTableCellRendererComponent(JTable table, Object value, 666 boolean isSelected, boolean hasFocus, int row, int column) 667 { 668 Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column); 669 670 int state = ((Integer ) table.getModel().getValueAt(row, 0)).intValue(); 671 if (state == -2) 672 { 673 renderer.setForeground(Color.GRAY); 675 if (isSelected){ 676 renderer.setBackground(table.getSelectionBackground()); 677 } 678 else { 679 renderer.setBackground(table.getBackground()); 680 } 681 } 682 else { 683 if (isSelected){ 684 renderer.setForeground(table.getSelectionForeground()); 685 renderer.setBackground(table.getSelectionBackground()); 686 } 687 else { 688 renderer.setForeground(table.getForeground()); 689 renderer.setBackground(table.getBackground()); 690 } 691 } 692 693 return renderer; 694 } 695 696 } 697 698 } 699 | Popular Tags |