GPTreeTableBase.java

Index Score
net.sourceforge.ganttproject
GanttProject

View: Reasons, Metrics, Source Code

These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.

MetricDescription
/* Copyright (C) 2008 Dmitry Barashev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ package net.sourceforge.ganttproject; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.text.AttributedCharacterIterator; import java.text.DateFormat; import java.text.MessageFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import javax.swing.AbstractCellEditor; import javax.swing.Action; import javax.swing.ImageIcon; import javax.swing.InputMap; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import net.sourceforge.ganttproject.action.GPAction; import net.sourceforge.ganttproject.gui.GanttDialogCustomColumn; import net.sourceforge.ganttproject.gui.TableHeaderUIFacade; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.gui.options.OptionsPageBuilder; import net.sourceforge.ganttproject.gui.options.model.DateOption; import net.sourceforge.ganttproject.gui.options.model.DefaultDateOption; import net.sourceforge.ganttproject.language.GanttLanguage; import net.sourceforge.ganttproject.task.CustomPropertyEvent; import org.jdesktop.swingx.JXTreeTable; import org.jdesktop.swingx.calendar.DatePickerFormatter; import org.jdesktop.swingx.decorator.HighlighterFactory; import org.jdesktop.swingx.table.TableColumnExt; import org.jdesktop.swingx.table.TableColumnModelExt; import org.jdesktop.swingx.treetable.TreeTableModel; public abstract class GPTreeTableBase extends JXTreeTable implements CustomPropertyListener{ private final IGanttProject myProject; private final UIFacade myUIFacade; private final CustomPropertyManager myCustomPropertyManager; private final TableHeaderUIFacade myVisibleFields = new VisibleFieldsImpl(); protected IGanttProject getProject() { return myProject; } @Override public void addColumn(TableColumn column) { super.addColumn(column); //new Exception("column="+column.getIdentifier()).printStackTrace(); } protected GPTreeTableBase(IGanttProject project, UIFacade uifacade, TreeTableModel model, CustomPropertyManager customPropertyManager) { super(model);/* { protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { if (e.isAltDown() || e.isControlDown()) { putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); } boolean result = super.processKeyBinding(ks, e, condition, pressed); putClientProperty("JTable.autoStartsEdit", Boolean.TRUE); return result; } }); */ myCustomPropertyManager = customPropertyManager; myProject = project; myUIFacade = uifacade; myCustomPropertyManager.addListener(this); myProject.addProjectEventListener(new ProjectEventListener.Stub(){ public void projectClosed() { clearColumns(); } public void projectModified() { } public void projectSaved() { } public void projectWillBeOpened() { createDefaultColumns(); } }); getTree().setScrollsOnExpand(true); } protected UIFacade getUIFacade() { return myUIFacade; } protected CustomPropertyManager getCustomPropertyManager() { return myCustomPropertyManager; } protected TableColumnExt newTableColumnExt(int modelIndex) { return newTableColumnExt(modelIndex, getTreeTableModel().getColumnClass(modelIndex)); } protected TableColumnExt newTableColumnExt(int modelIndex, Class valueClass) { TableColumnExt result = new TableColumnExt(modelIndex); TableCellEditor defaultEditor = getDefaultEditor(valueClass); if (defaultEditor!=null) { result.setCellEditor(new TreeTableCellEditorImpl(defaultEditor)); } return result; } public void customPropertyChange(CustomPropertyEvent event) { switch(event.getType()) { case CustomPropertyEvent.EVENT_ADD: addNewCustomColumn(event.getDefinition()); break; case CustomPropertyEvent.EVENT_REMOVE: deleteCustomColumn(event.getDefinition()); break; } } protected void onAddCustomColumnAction(final int contextColumn) { GanttDialogCustomColumn d = new GanttDialogCustomColumn( getUIFacade(), myCustomPropertyManager) { @Override protected void ok(CustomPropertyDefinition definition) { getColumnModel().moveColumn(getTable().getColumnCount()-1, contextColumn); } }; d.setVisible(true); } protected void onDeleteCustomColumnAction(CustomPropertyDefinition def) { myCustomPropertyManager.deleteDefinition(def); } protected void addNewCustomColumn(CustomPropertyDefinition customPropertyDefinition) { assert customPropertyDefinition!=null; if (customPropertyDefinition.getName() != null) { TableColumnExt newColumn = newTableColumnExt(getColumnCount(true), customPropertyDefinition.getType()); newColumn.setIdentifier(customPropertyDefinition.getID()); newColumn.setHeaderValue(customPropertyDefinition.getName()); addColumn(newColumn); getProject().setModified(); } Runnable t = new Runnable() { public void run() { calculateWidth(); revalidate(); } }; SwingUtilities.invokeLater(t); } protected void deleteCustomColumn(CustomPropertyDefinition customPropertyDefinition) { TableColumn tableColumn = getColumn(customPropertyDefinition.getID()); removeColumn(tableColumn); } void calculateWidth() { int width = 0; final int nbCol = getColumnCount(); for (int i = 0; i < nbCol; i++) { TableColumnExt tce = getColumnExt(i); if (tce.isVisible()) { width += tce.getPreferredWidth(); } } setPreferredScrollableViewportSize(new Dimension(width, 0)); } protected TableCellEditor newDateCellEditor() { return new DateCellEditor() { protected Date parseDate(String dateString) { DateFormat[] formats = new DateFormat[] { GanttLanguage.getInstance().getLongDateFormat(), GanttLanguage.getInstance().getMediumDateFormat(), GanttLanguage.getInstance().getShortDateFormat(), }; for (int i=0; i<formats.length; i++) { try { Date typedDate = formats[i].parse(dateString); Calendar typedCal = GanttLanguage.getInstance().newCalendar(); typedCal.setTime(typedDate); Calendar projectStartCal = GanttLanguage.getInstance().newCalendar(); projectStartCal.setTime(myProject.getTaskManager().getProjectStart()); int yearDiff = Math.abs(typedCal.get(Calendar.YEAR) - projectStartCal.get(Calendar.YEAR)); if (yearDiff > 1500) { AttributedCharacterIterator iter = formats[i].formatToCharacterIterator(typedDate); int additionalZeroes = -1; StringBuffer result = new StringBuffer(); for (char c = iter.first(); c!=iter.DONE; c = iter.next()) { if (iter.getAttribute(DateFormat.Field.YEAR)!=null && additionalZeroes==-1) { additionalZeroes = iter.getRunLimit(DateFormat.Field.YEAR) - iter.getIndex(); for (int j=0; j<additionalZeroes; j++) { result.append('0'); } } result.append(c); } if (!result.toString().equals(dateString)) { typedCal.add(Calendar.YEAR, 2000); return typedCal.getTime(); } } return typedDate; } catch (ParseException e) { if (i+1 == formats.length) { return null; } } } return null; } }; } protected TableCellRenderer newDateCellRenderer() { return new DateCellRenderer(); } private static class DateCellRenderer extends DefaultTableCellRenderer { @Override public void setValue(Object value) { if (value==null) { setText(""); } else { assert value instanceof GanttCalendar; try { String text = new DatePickerFormatter().valueToString(((GanttCalendar)value).getTime()); setText(text); } catch (ParseException e) { setText(""); } } } } private class DateCellEditor extends AbstractCellEditor implements TableCellEditor{ private DateOption myDate = null; public DateCellEditor() { } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { assert value instanceof GanttCalendar; myDate = new DefaultDateOption("", ((GanttCalendar)value).getTime()); myDate.lock(); OptionsPageBuilder builder = new OptionsPageBuilder(); Component result = builder.createDateComponent(myDate, false); return result; } public Object getCellEditorValue() { return new GanttCalendar(myDate.getValue()); } protected Date parseDate(String dateString) { DateFormat[] formats = new DateFormat[] { GanttLanguage.getInstance().getLongDateFormat(), GanttLanguage.getInstance().getMediumDateFormat(), GanttLanguage.getInstance().getShortDateFormat(), }; for (int i=0; i<formats.length; i++) { try { Date typedDate = formats[i].parse(dateString); Calendar typedCal = GanttLanguage.getInstance().newCalendar(); typedCal.setTime(typedDate); Calendar projectStartCal = GanttLanguage.getInstance().newCalendar(); projectStartCal.setTime(myProject.getTaskManager().getProjectStart()); int yearDiff = Math.abs(typedCal.get(Calendar.YEAR) - projectStartCal.get(Calendar.YEAR)); if (yearDiff > 1500) { AttributedCharacterIterator iter = formats[i].formatToCharacterIterator(typedDate); int additionalZeroes = -1; StringBuffer result = new StringBuffer(); for (char c = iter.first(); c!=iter.DONE; c = iter.next()) { if (iter.getAttribute(DateFormat.Field.YEAR)!=null && additionalZeroes==-1) { additionalZeroes = iter.getRunLimit(DateFormat.Field.YEAR) - iter.getIndex(); for (int j=0; j<additionalZeroes; j++) { result.append('0'); } } result.append(c); } if (!result.toString().equals(dateString)) { typedCal.add(Calendar.YEAR, 2000); return typedCal.getTime(); } } return typedDate; } catch (ParseException e) { if (i+1 == formats.length) { return null; } } } return null; } public boolean stopCellEditing() { myDate.commit(); return super.stopCellEditing(); } } protected GPTreeTableBase getTable() { return this; } protected GPTreeTableBase getTreeTable() { return this; } protected void createDefaultColumns() { } protected void initTreeTable() { setAutoCreateColumnsFromModel(false); setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); setShowHorizontalLines(true); setOpenIcon(null); setClosedIcon(null); setCollapsedIcon(new ImageIcon(getClass().getResource("/icons/plus.gif"))); setExpandedIcon(new ImageIcon(getClass().getResource("/icons/minus.gif"))); setLeafIcon(null); setColumnControlVisible(true); setBackground(Color.WHITE); { getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { getUIFacade().getMainFrame().repaint(); } }); } setHighlighters(HighlighterFactory.createSimpleStriping()); getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { onCellSelectionChanged(); } }); getTable().getColumnModel().getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { onCellSelectionChanged(); } }); setDefaultEditor(GregorianCalendar.class, newDateCellEditor()); getTableHeader().addMouseListener(new HeaderMouseListener()); } void clearColumns() { List<TableColumn> columns = new ArrayList<TableColumn>(getColumns(true)); for (TableColumn column : columns) { removeColumn(column); } } @Override public boolean getAutoCreateColumnsFromModel() { return false; } /** * Displays all the table columns. */ protected void displayAllColumns() { for (TableColumn c : getColumns(true)) { ((TableColumnExt)c).setVisible(true); } } protected void onCellSelectionChanged() { if (!getTable().isEditing()) { int row = getTable().getSelectedRow(); int col = getTable().getSelectedColumn(); Rectangle rect = getTable().getCellRect(row, col, true); getTable().scrollRectToVisible(rect); } } class HeaderMouseListener extends MouseAdapter { /** * Creates a new HeaderMouseListener */ public HeaderMouseListener() { super(); } public void mousePressed(MouseEvent e) { handlePopupTrigger(e); } public void mouseReleased(MouseEvent e) { handlePopupTrigger(e); } private void handlePopupTrigger(MouseEvent e) { if (e.isPopupTrigger()) { int contextColumn = getTable().columnAtPoint(e.getPoint()); Action[] contextActions = createHeaderContextMenuActions(contextColumn); getUIFacade().showPopupMenu((Component) e.getSource(), contextActions, e.getX(), e.getY()); } } private Action[] createHeaderContextMenuActions(final int contextColumn) { final TableColumnExt contextTableColumn = getTable().getColumnExt(contextColumn); final CustomPropertyDefinition cc = getCustomPropertyManager().getCustomPropertyDefinition( String.valueOf(contextTableColumn.getIdentifier())); GPAction actionAdd = new GPAction("addCustomColumn") { public void actionPerformed(ActionEvent e) { getUIFacade().getUndoManager().undoableEdit( "PopUpNewColumn", new Runnable() { public void run() { onAddCustomColumnAction(contextColumn); } }); } protected String getIconFilePrefix() { return null; } protected String getLocalizedName() { return getI18n("addCustomColumn"); } }; final Runnable runDelete = new Runnable() { public void run() { onDeleteCustomColumnAction(cc); } }; GPAction actionDelete = new GPAction("deleteCustomColumn") { public void actionPerformed(ActionEvent e) { getUIFacade().getUndoManager().undoableEdit("deleteCustomColumn", runDelete); } protected String getIconFilePrefix() { return null; } protected String getLocalizedName() { return getI18n("deleteCustomColumn"); } }; if (cc == null) { actionDelete.setEnabled(false); } final Runnable runShowAll = new Runnable() { public void run() { displayAllColumns(); } }; GPAction actionShowAll = new GPAction("displayAll") { protected String getIconFilePrefix() { return null; } protected String getLocalizedName() { return getI18n("displayAll"); } public void actionPerformed(ActionEvent e) { getUIFacade().getUndoManager().undoableEdit("displayAllColumns", runShowAll); } }; GPAction actionShowHideColumns = new GPAction("showHideColumns") { protected String getIconFilePrefix() { return null; } public void actionPerformed(ActionEvent e) { ShowHideColumnsDialog dlg = new ShowHideColumnsDialog( getUIFacade(), getTable().getColumns(true)); dlg.show(); } protected String getLocalizedName() { return getI18n("taskTable.header.contextMenu.showHideColumns"); } }; final Runnable runHideContextColumn = new Runnable() { public void run() { contextTableColumn.setVisible(false); } }; GPAction actionHideContextColumn = new GPAction("hideContextColumn") { protected String getIconFilePrefix() { return null; } public void actionPerformed(ActionEvent e) { getUIFacade().getUndoManager().undoableEdit("hideContextColumn", runHideContextColumn); } protected String getLocalizedName() { return MessageFormat.format( getI18n("taskTable.header.contextMenu.hideContextColumn"), contextTableColumn.getHeaderValue()); } }; return new Action[] {actionAdd, actionDelete, null, actionHideContextColumn, actionShowHideColumns, actionShowAll}; } } public TableHeaderUIFacade getVisibleFields() { return myVisibleFields; } class VisibleFieldsImpl implements TableHeaderUIFacade { public void add(String name, int order, int width) { throw new UnsupportedOperationException(); } public void clear() { clearColumns(); } public Column getField(final int index) { final TableColumnModelExt columnModel = (TableColumnModelExt) getColumnModel(); List<TableColumn> columns = columnModel.getColumns(true); final TableColumnExt column = (TableColumnExt) columns.get(index); return new Column() { public String getID() { return String.valueOf(column.getIdentifier()); } public String getName() { return column.getTitle(); } public int getOrder() { return columnModel.getColumnIndex(column.getIdentifier()); } public int getWidth() { return column.getWidth(); } public boolean isVisible() { return column.isVisible(); } }; } public int getSize() { return getColumnCount(true); } public void importData(TableHeaderUIFacade source) { List<Column> buf = new ArrayList<Column>(); for (int i=0; i<source.getSize(); i++) { buf.add(source.getField(i)); } Collections.sort(buf, new Comparator<Column>() { public int compare(Column o1, Column o2) { return o1.getOrder() - o2.getOrder(); } }); int newPosition = 0; for (Column nextField : buf) { TableColumnExt newTableColumn = getColumnExt(nextField.getID()); if (newTableColumn == null) { newTableColumn = newTableColumnExt(getColumnCount()); CustomPropertyDefinition def = getCustomPropertyManager().getCustomPropertyDefinition(nextField.getID()); if (def!=null) { newTableColumn.setTitle(def.getName()); newTableColumn.setHeaderValue(def.getName()); } addColumn(newTableColumn); } newTableColumn.setWidth(nextField.getWidth()); newTableColumn.setIdentifier(nextField.getID()); newTableColumn.setVisible(nextField.isVisible()); getTable().getColumnModel().moveColumn(getTable().getColumnModel().getColumnIndex(nextField.getID()), newPosition); newPosition++; } } } void setAction(Action action) { addAction(action, (KeyStroke) action.getValue(Action.ACCELERATOR_KEY)); } void addAction(Action action, KeyStroke keyStroke) { InputMap inputMap = getInputMap(); inputMap.put(keyStroke, action.getValue(Action.NAME)); getActionMap().put(action.getValue(Action.NAME), action); } }

The table below shows all metrics for GPTreeTableBase.java.

MetricValueDescription