Hi, Does anybody know how windows users are supposed to patch those kind of diff files ? I only find one java lib claiming to do that (jpatchlib), but development is ongoing and it is not yet very user friendly (no gui, no jar, no build, only .java) ?
Michaël > >Paul > > >------------------------------------------------------------------------ > >Index: src/org/openjump/OpenJumpConfiguration.java >=================================================================== >RCS file: >/cvsroot/jump-pilot/openjump/src/org/openjump/OpenJumpConfiguration.java,v >retrieving revision 1.42 >diff -u -r1.42 OpenJumpConfiguration.java >--- src/org/openjump/OpenJumpConfiguration.java 24 Mar 2007 12:27:45 >-0000 1.42 >+++ src/org/openjump/OpenJumpConfiguration.java 11 Jun 2007 19:26:47 >-0000 >@@ -10,10 +10,16 @@ > */ > package org.openjump; > >-import javax.swing.JMenu; >+import java.util.Date; >+ > import javax.swing.JPopupMenu; > > import org.openjump.core.ccordsys.srid.EnsureAllLayersHaveSRIDStylePlugIn; >+import org.openjump.core.ui.builder.DateTimeUiBuilder; >+import org.openjump.core.ui.builder.DateUIBuilder; >+import org.openjump.core.ui.builder.FeatureUiBuilder; >+import org.openjump.core.ui.builder.UiBuilderRegistry; >+import org.openjump.core.ui.component.InfoModelDetailPanel; > import org.openjump.core.ui.plugin.customize.BeanToolsPlugIn; > import org.openjump.core.ui.plugin.edit.ReplicateSelectedItemsPlugIn; > import org.openjump.core.ui.plugin.edit.SelectAllLayerItemsPlugIn; >@@ -54,19 +60,19 @@ > import org.openjump.core.ui.plugin.view.ShowScalePlugIn; > import org.openjump.core.ui.plugin.view.ZoomToScalePlugIn; > import org.openjump.core.ui.plugin.wms.ZoomToWMSPlugIn; >+import org.openjump.core.ui.style.decoration.ArrowLineStringMiddlepointStyle; > import org.openjump.sigle.plugin.geoprocessing.layers.SpatialJoinPlugIn; > import > org.openjump.sigle.plugin.geoprocessing.oneLayer.topology.PlanarGraphPlugIn; > import org.openjump.sigle.plugin.joinTable.JoinTablePlugIn; > import org.openjump.sigle.plugin.replace.ReplaceValuePlugIn; > >-import org.openjump.core.ui.style.decoration.ArrowLineStringMiddlepointStyle; >- >+import com.vividsolutions.jump.feature.Feature; > import com.vividsolutions.jump.workbench.WorkbenchContext; > import com.vividsolutions.jump.workbench.plugin.PlugInContext; >+import com.vividsolutions.jump.workbench.ui.InfoFrame; > import com.vividsolutions.jump.workbench.ui.LayerViewPanel; >-import com.vividsolutions.jump.workbench.ui.MenuNames; >-import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller; > import com.vividsolutions.jump.workbench.ui.plugin.BeanShellPlugIn; >+import com.vividsolutions.jump.workbench.ui.swing.ComponentFactoryRegistry; > > import > de.fho.jump.pirol.plugins.EditAttributeByFormula.EditAttributeByFormulaPlugIn; > import de.latlon.deejump.plugin.SaveLegendPlugIn; >@@ -360,5 +366,17 @@ > projectionPlugin.initialize(new PlugInContext(workbenchContext, > null, null, null, null)); > */ > >+ /********************** >+ * UI Builders >+ **********************/ >+ UiBuilderRegistry htmlrendererRepository = >UiBuilderRegistry.getInstance(workbenchContext); >+ htmlrendererRepository.addRenderer(Feature.class, new FeatureUiBuilder()); >+ htmlrendererRepository.addRenderer(Date.class, new DateTimeUiBuilder()); >+ htmlrendererRepository.addRenderer(java.sql.Date.class, new >DateUIBuilder()); >+ >+ /*********************** >+ * Info Frame Panels >+ **********************/ >+ ComponentFactoryRegistry.addComponentFactory(workbenchContext, >InfoFrame.CLASSIFICATION, InfoModelDetailPanel.class); > } > } >Index: src/com/vividsolutions/jump/workbench/ui/InfoFrame.java >=================================================================== >RCS file: >/cvsroot/jump-pilot/openjump/src/com/vividsolutions/jump/workbench/ui/InfoFrame.java,v >retrieving revision 1.3 >diff -u -r1.3 InfoFrame.java >--- src/com/vividsolutions/jump/workbench/ui/InfoFrame.java 3 Jun 2007 >20:53:31 -0000 1.3 >+++ src/com/vividsolutions/jump/workbench/ui/InfoFrame.java 11 Jun 2007 >19:26:46 -0000 >@@ -30,159 +30,201 @@ > * www.vividsolutions.com > */ > package com.vividsolutions.jump.workbench.ui; >+ > import java.awt.BorderLayout; >+import java.util.Iterator; >+import java.util.List; >+ >+import javax.swing.JComponent; > import javax.swing.JInternalFrame; > import javax.swing.JPanel; > import javax.swing.JTabbedPane; > import javax.swing.event.InternalFrameAdapter; > import javax.swing.event.InternalFrameEvent; >+ > import com.vividsolutions.jts.util.Assert; > import com.vividsolutions.jump.I18N; > import com.vividsolutions.jump.workbench.WorkbenchContext; > import com.vividsolutions.jump.workbench.model.LayerManager; > import com.vividsolutions.jump.workbench.model.LayerManagerProxy; > import com.vividsolutions.jump.workbench.model.Task; >-import com.vividsolutions.jump.workbench.ui.cursortool.editing.EditingPlugIn; >+import com.vividsolutions.jump.workbench.registry.Registry; > import com.vividsolutions.jump.workbench.ui.images.IconLoader; >+import com.vividsolutions.jump.workbench.ui.swing.ComponentFactory; >+import com.vividsolutions.jump.workbench.ui.swing.ComponentFactoryRegistry; >+import com.vividsolutions.jump.workbench.ui.swing.IconComponent; > > /** > * Provides proxied (non-spatial) views of a Layer. > */ >-public class InfoFrame >- extends JInternalFrame >- implements >- LayerManagerProxy, >- SelectionManagerProxy, >- LayerNamePanelProxy, >- TaskFrameProxy, >- LayerViewPanelProxy { >- public LayerManager getLayerManager() { >- return layerManager; >- } >- public TaskFrame getTaskFrame() { >- return attributeTab.getTaskFrame(); >- } >- private LayerManager layerManager; >- private BorderLayout borderLayout1 = new BorderLayout(); >- private AttributeTab attributeTab; >- private InfoModel model = new InfoModel(); >- private GeometryInfoTab geometryInfoTab; >- private JTabbedPane tabbedPane = new JTabbedPane(); >- private WorkbenchFrame workbenchFrame; >- public InfoFrame( >- WorkbenchContext workbenchContext, >- LayerManagerProxy layerManagerProxy, >- final TaskFrame taskFrame) { >- geometryInfoTab = new GeometryInfoTab(model, workbenchContext); >- //Keep my own copy of LayerManager, because it will be nulled in >TaskFrame >- //when TaskFrame closes (it may in fact already be closed, which is >why >- //a LayerManagerProxy must be passed in too). But I have to >- //remember to null it when I close. [Jon Aquino] >- Assert.isTrue(layerManagerProxy.getLayerManager() != null); >- layerManager = layerManagerProxy.getLayerManager(); >- // I cannot see any reason to add this listener [mmichaud 2007-06-03] >- // See also WorkbenchFrame >- /*addInternalFrameListener(new InternalFrameAdapter() { >- public void internalFrameClosed(InternalFrameEvent e) { >- layerManager = new LayerManager(); >- } >- });*/ >- attributeTab = new AttributeTab(model, workbenchContext, taskFrame, >this, false); >- addInternalFrameListener(new InternalFrameAdapter() { >- public void internalFrameOpened(InternalFrameEvent e) { >- attributeTab.getToolBar().updateEnabledState(); >- } >- }); >- workbenchFrame = workbenchContext.getWorkbench().getFrame(); >- this.setResizable(true); >- this.setClosable(true); >- this.setMaximizable(true); >- this.setIconifiable(true); >- //This size is chosen so that when the user hits the Info tool, the >window >- //fits between the lower edge of the TaskFrame and the lower edge of >the >- //WorkbenchFrame. See the call to #setSize in WorkbenchFrame. [Jon >Aquino] >- //Make sure there's a little space for a custom FeatureTextWriter >- //[Jon Aquino 12/31/2003] >- this.setSize(550, 185); >- try { >- jbInit(); >- } catch (Exception e) { >- e.printStackTrace(); >- } >- tabbedPane.addTab("", IconLoader.icon("Table.gif"), attributeTab, >"Table View"); >- tabbedPane.addTab("", IconLoader.icon("Paper.gif"), geometryInfoTab, >"HTML View"); >+public class InfoFrame extends JInternalFrame implements LayerManagerProxy, >+ SelectionManagerProxy, LayerNamePanelProxy, TaskFrameProxy, >+ LayerViewPanelProxy { >+ >+ public static final String CLASSIFICATION = InfoFrame.class.getName(); >+ >+ public LayerManager getLayerManager() { >+ return layerManager; >+ } >+ >+ public TaskFrame getTaskFrame() { >+ return attributeTab.getTaskFrame(); >+ } >+ >+ private LayerManager layerManager; >+ >+ private BorderLayout borderLayout1 = new BorderLayout(); >+ >+ private AttributeTab attributeTab; >+ >+ private InfoModel model = new InfoModel(); >+ >+ private GeometryInfoTab geometryInfoTab; >+ >+ private JTabbedPane tabbedPane = new JTabbedPane(); >+ >+ private WorkbenchFrame workbenchFrame; >+ >+ public InfoFrame(WorkbenchContext workbenchContext, >+ LayerManagerProxy layerManagerProxy, final TaskFrame taskFrame) { >+ geometryInfoTab = new GeometryInfoTab(model, workbenchContext); >+ // Keep my own copy of LayerManager, because it will be nulled in >TaskFrame >+ // when TaskFrame closes (it may in fact already be closed, which is why >+ // a LayerManagerProxy must be passed in too). But I have to >+ // remember to null it when I close. [Jon Aquino] >+ Assert.isTrue(layerManagerProxy.getLayerManager() != null); >+ layerManager = layerManagerProxy.getLayerManager(); >+ // I cannot see any reason to add this listener [mmichaud 2007-06-03] >+ // See also WorkbenchFrame >+ /* >+ * addInternalFrameListener(new InternalFrameAdapter() { public void >+ * internalFrameClosed(InternalFrameEvent e) { layerManager = new >+ * LayerManager(); } }); >+ */ >+ attributeTab = new AttributeTab(model, workbenchContext, taskFrame, this, >+ false); >+ addInternalFrameListener(new InternalFrameAdapter() { >+ public void internalFrameOpened(InternalFrameEvent e) { >+ attributeTab.getToolBar().updateEnabledState(); >+ } >+ }); >+ workbenchFrame = workbenchContext.getWorkbench().getFrame(); >+ this.setResizable(true); >+ this.setClosable(true); >+ this.setMaximizable(true); >+ this.setIconifiable(true); >+ // This size is chosen so that when the user hits the Info tool, the >window >+ // fits between the lower edge of the TaskFrame and the lower edge of the >+ // WorkbenchFrame. See the call to #setSize in WorkbenchFrame. [Jon >Aquino] >+ // Make sure there's a little space for a custom FeatureTextWriter >+ // [Jon Aquino 12/31/2003] >+ this.setSize(550, 185); >+ try { >+ jbInit(); >+ } catch (Exception e) { >+ e.printStackTrace(); >+ } >+ tabbedPane.addTab("", IconLoader.icon("Table.gif"), attributeTab, >+ "Table View"); >+ tabbedPane.addTab("", IconLoader.icon("Paper.gif"), geometryInfoTab, >+ "HTML View"); >+ >+ for (Iterator factories = >ComponentFactoryRegistry.getComponentFactories(workbenchContext, >CLASSIFICATION).iterator(); factories.hasNext();) { >+ ComponentFactory factory = (ComponentFactory)factories.next(); >+ JComponent component = factory.createComponent(); >+ if (component instanceof IconComponent) { >+ IconComponent iconComponent = (IconComponent)component; >+ tabbedPane.addTab(component.getName(), iconComponent.getIcon(), >component, >+ component.getToolTipText()); >+ } else { >+ tabbedPane.addTab(component.getName(), null, component, >+ component.getToolTipText()); >+ } >+ if (component instanceof InfoModelAware) { >+ InfoModelAware tabAware = (InfoModelAware)component; >+ tabAware.setInfoModel(model); >+ } >+ } >+ updateTitle(taskFrame.getTask().getName()); >+ taskFrame.getTask().add(new Task.NameListener() { >+ public void taskNameChanged(String name) { > updateTitle(taskFrame.getTask().getName()); >- taskFrame.getTask().add(new Task.NameListener() { >- public void taskNameChanged(String name) { >- updateTitle(taskFrame.getTask().getName()); >- } >- }); >- addInternalFrameListener(new InternalFrameAdapter() { >- public void internalFrameClosed(InternalFrameEvent e) { >- //Assume that there are no other views on the model >- model.dispose(); >- } >- }); >- } >- public JPanel getAttributeTab() { >- return attributeTab; >- } >- public JPanel getGeometryTab() { >- return geometryInfoTab; >- } >- public void setSelectedTab(JPanel tab) { >- tabbedPane.setSelectedComponent(tab); >- } >- public static String title(String taskName) { >- return I18N.get("ui.InfoFrame.feature-info")+": " + taskName; >- } >- private void updateTitle(String taskName) { >- setTitle(title(taskName)); >- } >- public InfoModel getModel() { >- return model; >- } >- private void jbInit() throws Exception { >- setDefaultCloseOperation(DISPOSE_ON_CLOSE); >- // With the DefaultInternalFrameCloser of WorkbenchFrame, >- // I think this code is no more necessary [mmichaud 2007-06-03] >- /*addInternalFrameListener(new InternalFrameAdapter() { >- public void internalFrameClosing(InternalFrameEvent e) { >- //Regardless of the defaultCloseOperation, this InfoFrame >should be >- //removed from the WorkbenchFrame when the user hits X so it >won't >- //appear on the Window list. [Jon Aquino] >- try { >- workbenchFrame.removeInternalFrame(InfoFrame.this); >- } catch (Exception x) { >- workbenchFrame.handleThrowable(x); >- } >- } >- });*/ >- this.setTitle(I18N.get("ui.InfoFrame.feature-info")); >- this.getContentPane().setLayout(borderLayout1); >- tabbedPane.setTabPlacement(JTabbedPane.LEFT); >- this.getContentPane().add(tabbedPane, BorderLayout.CENTER); >- } >- public void surface() { >- JInternalFrame activeFrame = workbenchFrame.getActiveInternalFrame(); >- if (!workbenchFrame.hasInternalFrame(this)) { >- workbenchFrame.addInternalFrame(this, false, true); >- } >- if (activeFrame != null) { >- workbenchFrame.activateFrame(activeFrame); >- } >- moveToFront(); >- //Move this frame to the front, but don't activate it if the >TaskFrame is >- //active. Otherwise the user would need to re-activate the TaskFrame >before >- //making another Info gesture. [Jon Aquino] >- } >- public SelectionManager getSelectionManager() { >- return attributeTab.getPanel().getSelectionManager(); >- } >- public LayerNamePanel getLayerNamePanel() { >- return attributeTab; >- } >- public LayerViewPanel getLayerViewPanel() { >- return getTaskFrame().getLayerViewPanel(); >- } >+ } >+ }); >+ addInternalFrameListener(new InternalFrameAdapter() { >+ public void internalFrameClosed(InternalFrameEvent e) { >+ // Assume that there are no other views on the model >+ model.dispose(); >+ } >+ }); >+ } >+ >+ public JPanel getAttributeTab() { >+ return attributeTab; >+ } >+ >+ public JPanel getGeometryTab() { >+ return geometryInfoTab; >+ } >+ >+ public void setSelectedTab(JPanel tab) { >+ tabbedPane.setSelectedComponent(tab); >+ } >+ >+ public static String title(String taskName) { >+ return I18N.get("ui.InfoFrame.feature-info") + ": " + taskName; >+ } >+ >+ private void updateTitle(String taskName) { >+ setTitle(title(taskName)); >+ } >+ >+ public InfoModel getModel() { >+ return model; >+ } >+ >+ private void jbInit() throws Exception { >+ setDefaultCloseOperation(DISPOSE_ON_CLOSE); >+ // With the DefaultInternalFrameCloser of WorkbenchFrame, >+ // I think this code is no more necessary [mmichaud 2007-06-03] >+ /* >+ * addInternalFrameListener(new InternalFrameAdapter() { public void >+ * internalFrameClosing(InternalFrameEvent e) { //Regardless of the >+ * defaultCloseOperation, this InfoFrame should be //removed from the >+ * WorkbenchFrame when the user hits X so it won't //appear on the Window >+ * list. [Jon Aquino] try { >+ * workbenchFrame.removeInternalFrame(InfoFrame.this); } catch (Exception >x) { >+ * workbenchFrame.handleThrowable(x); } } }); >+ */ >+ this.setTitle(I18N.get("ui.InfoFrame.feature-info")); >+ this.getContentPane().setLayout(borderLayout1); >+ tabbedPane.setTabPlacement(JTabbedPane.LEFT); >+ this.getContentPane().add(tabbedPane, BorderLayout.CENTER); >+ } >+ >+ public void surface() { >+ JInternalFrame activeFrame = workbenchFrame.getActiveInternalFrame(); >+ if (!workbenchFrame.hasInternalFrame(this)) { >+ workbenchFrame.addInternalFrame(this, false, true); >+ } >+ if (activeFrame != null) { >+ workbenchFrame.activateFrame(activeFrame); >+ } >+ moveToFront(); >+ // Move this frame to the front, but don't activate it if the TaskFrame is >+ // active. Otherwise the user would need to re-activate the TaskFrame >before >+ // making another Info gesture. [Jon Aquino] >+ } >+ >+ public SelectionManager getSelectionManager() { >+ return attributeTab.getPanel().getSelectionManager(); >+ } >+ >+ public LayerNamePanel getLayerNamePanel() { >+ return attributeTab; >+ } >+ >+ public LayerViewPanel getLayerViewPanel() { >+ return getTaskFrame().getLayerViewPanel(); >+ } > } >Index: src/com/vividsolutions/jump/workbench/ui/InfoModel.java >=================================================================== >RCS file: >/cvsroot/jump-pilot/openjump/src/com/vividsolutions/jump/workbench/ui/InfoModel.java,v >retrieving revision 1.1 >diff -u -r1.1 InfoModel.java >--- src/com/vividsolutions/jump/workbench/ui/InfoModel.java 16 Jun 2005 >22:11:46 -0000 1.1 >+++ src/com/vividsolutions/jump/workbench/ui/InfoModel.java 11 Jun 2007 >19:26:46 -0000 >@@ -92,13 +92,13 @@ > > public void remove(Layer layer) { > LayerTableModel layerTableModel = getTableModel(layer); >- ((LayerTableModel) layerToTableModelMap.get(layer)).dispose(); >- layerToTableModelMap.remove(layer); > > for (Iterator i = listeners.iterator(); i.hasNext();) { > InfoModelListener listener = (InfoModelListener) i.next(); > listener.layerRemoved(layerTableModel); > } >+ ((LayerTableModel) layerToTableModelMap.get(layer)).dispose(); >+ layerToTableModelMap.remove(layer); > } > > public void clear() { >Index: src/com/vividsolutions/jump/feature/FeatureSchema.java >=================================================================== >RCS file: >/cvsroot/jump-pilot/openjump/src/com/vividsolutions/jump/feature/FeatureSchema.java,v >retrieving revision 1.2 >diff -u -r1.2 FeatureSchema.java >--- src/com/vividsolutions/jump/feature/FeatureSchema.java 27 Jul 2005 >21:20:09 -0000 1.2 >+++ src/com/vividsolutions/jump/feature/FeatureSchema.java 11 Jun 2007 >19:26:45 -0000 >@@ -51,6 +51,9 @@ > private int attributeCount = 0; > private ArrayList attributeNames = new ArrayList(); > private ArrayList attributeTypes = new ArrayList(); >+ >+ /** The name of the schema. */ >+ private String name; > > //todo Deep-copy! [Jon Aquino] > //deep copy done 25. Juli 2005 [sstein] >@@ -195,4 +198,22 @@ > return coordinateSystem; > } > >+ /** >+ * Get the name of the schema. >+ * >+ * @return The name of the schema. >+ */ >+ public String getName() { >+ return name; >+ } >+ >+ /** >+ * Set the name of the schema. >+ * >+ * @param name The name of the schema. >+ */ >+ public void setName(String name) { >+ this.name = name; >+ } >+ > } >Index: src/com/vividsolutions/jump/workbench/ui/InfoModelAware.java >=================================================================== >RCS file: src/com/vividsolutions/jump/workbench/ui/InfoModelAware.java >diff -N src/com/vividsolutions/jump/workbench/ui/InfoModelAware.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/com/vividsolutions/jump/workbench/ui/InfoModelAware.java 1 Jan >1970 00:00:00 -0000 >@@ -0,0 +1,6 @@ >+package com.vividsolutions.jump.workbench.ui; >+ >+public interface InfoModelAware { >+ InfoModel getInfoModel(); >+ void setInfoModel(InfoModel model); >+} >Index: src/org/openjump/core/ui/builder/StringUiBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/StringUiBuilder.java >diff -N src/org/openjump/core/ui/builder/StringUiBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/StringUiBuilder.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,12 @@ >+package org.openjump.core.ui.builder; >+ >+import com.vividsolutions.jump.workbench.ui.GUIUtil; >+ >+public class StringUiBuilder extends AbstractUiBuilder { >+ >+ public void appendHtml(StringBuffer s, Object object) { >+ if (object != null) { >+ s.append(GUIUtil.escapeHTML(object.toString(), false, false)); >+ } >+ } >+} >Index: src/org/openjump/core/ui/component/FeatureViewPanel.java >=================================================================== >RCS file: src/org/openjump/core/ui/component/FeatureViewPanel.java >diff -N src/org/openjump/core/ui/component/FeatureViewPanel.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/component/FeatureViewPanel.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,100 @@ >+package org.openjump.core.ui.component; >+ >+import java.awt.BorderLayout; >+import java.awt.Color; >+ >+import javax.swing.JEditorPane; >+import javax.swing.JPanel; >+import javax.swing.JScrollPane; >+ >+import org.openjump.core.ui.builder.FeatureUiBuilder; >+import org.openjump.core.ui.builder.UiBuilderRegistry; >+ >+import com.vividsolutions.jump.feature.Feature; >+import com.vividsolutions.jump.workbench.WorkbenchContext; >+import com.vividsolutions.jump.workbench.model.Layer; >+import com.vividsolutions.jump.workbench.ui.GUIUtil; >+ >+public class FeatureViewPanel extends JPanel { >+ private JEditorPane editorPane = new JEditorPane(); >+ >+ private Feature feature; >+ >+ private FeatureUiBuilder renderer; >+ >+ private Layer layer; >+ >+ public FeatureViewPanel(WorkbenchContext context) { >+ renderer = new FeatureUiBuilder(); >+ renderer.setRegistry(UiBuilderRegistry.getInstance(context)); >+ jbInit(); >+ } >+ >+ void jbInit() { >+ JScrollPane scrollPane = new JScrollPane(); >+ editorPane.setEditable(false); >+ editorPane.setText("jEditorPane1"); >+ editorPane.setContentType("text/html"); >+ this.setLayout(new BorderLayout()); >+ this.add(scrollPane, BorderLayout.CENTER); >+ scrollPane.getViewport().add(editorPane, null); >+ } >+ >+ public Color sidebarColor(Layer layer) { >+ Color basicColor = layer.getBasicStyle().isRenderingFill() ? >layer.getBasicStyle() >+ .getFillColor() >+ : layer.getBasicStyle().getLineColor(); >+ int alpha = layer.getBasicStyle().getAlpha(); >+ return GUIUtil.toSimulatedTransparency(GUIUtil.alphaColor(basicColor, >alpha)); >+ } >+ >+ private String toHTML(Color color) { >+ String colorString = "#"; >+ colorString += pad(Integer.toHexString(color.getRed())); >+ colorString += pad(Integer.toHexString(color.getGreen())); >+ colorString += pad(Integer.toHexString(color.getBlue())); >+ return colorString; >+ } >+ >+ private String pad(String s) { >+ return (s.length() == 1) ? ("0" + s) : s; >+ } >+ >+ public void updateText() { >+ if (feature != null) { >+ StringBuffer s = new StringBuffer(); >+ s.append("<div style=\"padding-left: 5px; background-color: " >+ + toHTML(sidebarColor(layer)) + "\">"); >+ s.append("<div style=\"font-size: 14pt;font-weight:bold;padding: 1px >2px;margin-bottom: 3px; background-color:white\">"); >+ s.append(layer.getName()); >+ s.append("</div>"); >+ renderer.appendHtml(s, feature, false); >+ editorPane.setText(s.toString()); >+ s.append("</div>"); >+ } else { >+ editorPane.setText(""); >+ } >+ editorPane.setCaretPosition(0); >+ } >+ >+ /** >+ * @return the feature >+ */ >+ public Feature getFeature() { >+ return feature; >+ } >+ >+ /** >+ * @param feature the feature to set >+ */ >+ public void setFeature(Feature feature) { >+ this.feature = feature; >+ updateText(); >+ } >+ >+ public void setLayer(Layer layer) { >+ this.layer = layer; >+ >+ } >+ >+} >Index: >src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactoryRegistry.java >=================================================================== >RCS file: >src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactoryRegistry.java >diff -N >src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactoryRegistry.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ >src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactoryRegistry.java > 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,60 @@ >+package com.vividsolutions.jump.workbench.ui.swing; >+ >+import java.util.List; >+ >+import com.vividsolutions.jump.workbench.WorkbenchContext; >+import com.vividsolutions.jump.workbench.registry.Registry; >+ >+/** >+ * Utility class to manage the list of [EMAIL PROTECTED] ComponentFactory} in >the >+ * [EMAIL PROTECTED] Registry} for the classification. >+ * >+ * @author Paul Austin >+ * @see ComponentFactory >+ */ >+public class ComponentFactoryRegistry { >+ /** >+ * Add a new component factory for the component class to the registry for >the >+ * classification. >+ * >+ * @param context The workbench context that contains the registry. >+ * @param classification The classification to add the factory to. >+ * @param componentClass The component class. >+ * @see WorkbenchContextComponentFactory >+ */ >+ public static void addComponentFactory(WorkbenchContext context, >+ String classification, Class componentClass) { >+ WorkbenchContextComponentFactory factory = new >WorkbenchContextComponentFactory( >+ componentClass, context); >+ addComponentFactory(context, classification, factory); >+ } >+ >+ /** >+ * Add the component factory to the registry for the classification. >+ * >+ * @param context The workbench context that contains the registry. >+ * @param classification The classification to add the factory to. >+ * @param factory The factory that creates the components. >+ */ >+ public static void addComponentFactory(WorkbenchContext context, >+ String classification, ComponentFactory factory) { >+ Registry registry = context.getRegistry(); >+ registry.createEntry(classification, factory); >+ } >+ >+ /** >+ * Get the component factories for the classification from the registry. >+ * >+ * @param context The workbench context that contains the registry. >+ * @param classification The classification to add the factory to. >+ * @return The list of component factories >+ * @see ComponentFactory >+ */ >+ public static List getComponentFactories(WorkbenchContext context, >+ String classification) { >+ Registry registry = context.getRegistry(); >+ List factories = registry.getEntries(classification); >+ return factories; >+ } >+ >+} >Index: src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactory.java >=================================================================== >RCS file: src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactory.java >diff -N src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactory.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/com/vividsolutions/jump/workbench/ui/swing/ComponentFactory.java >1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,7 @@ >+package com.vividsolutions.jump.workbench.ui.swing; >+ >+import javax.swing.JComponent; >+ >+public interface ComponentFactory { >+ JComponent createComponent(); >+} >Index: src/org/openjump/core/ui/builder/AbstractUiBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/AbstractUiBuilder.java >diff -N src/org/openjump/core/ui/builder/AbstractUiBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/AbstractUiBuilder.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,28 @@ >+package org.openjump.core.ui.builder; >+ >+ >+public abstract class AbstractUiBuilder implements UiBuilder { >+ private UiBuilderRegistry registry; >+ >+ public String toHtml(final Object object) { >+ StringBuffer s = new StringBuffer(); >+ appendHtml(s, object); >+ return s.toString(); >+ } >+ >+ /** >+ * @return the registry >+ */ >+ public UiBuilderRegistry getRegistry() { >+ return registry; >+ } >+ >+ /** >+ * @param registry the registry to set >+ */ >+ public void setRegistry(UiBuilderRegistry registry) { >+ this.registry = registry; >+ } >+ >+ >+} >Index: src/org/openjump/core/ui/component/InfoModelDetailPanel.java >=================================================================== >RCS file: src/org/openjump/core/ui/component/InfoModelDetailPanel.java >diff -N src/org/openjump/core/ui/component/InfoModelDetailPanel.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/component/InfoModelDetailPanel.java 1 Jan >1970 00:00:00 -0000 >@@ -0,0 +1,244 @@ >+package org.openjump.core.ui.component; >+ >+import java.awt.BorderLayout; >+import java.awt.event.ActionEvent; >+import java.awt.event.ActionListener; >+import java.util.Iterator; >+ >+import javax.swing.Icon; >+import javax.swing.JButton; >+import javax.swing.JPanel; >+import javax.swing.JTextField; >+import javax.swing.JTextPane; >+ >+import org.openjump.core.ui.plugin.enablecheck.BooleanPropertyEnableCheck; >+ >+import com.vividsolutions.jump.I18N; >+import com.vividsolutions.jump.feature.Feature; >+import com.vividsolutions.jump.workbench.WorkbenchContext; >+import com.vividsolutions.jump.workbench.model.Layer; >+import com.vividsolutions.jump.workbench.ui.EnableableToolBar; >+import com.vividsolutions.jump.workbench.ui.InfoModel; >+import com.vividsolutions.jump.workbench.ui.InfoModelAware; >+import com.vividsolutions.jump.workbench.ui.InfoModelListener; >+import com.vividsolutions.jump.workbench.ui.LayerTableModel; >+import com.vividsolutions.jump.workbench.ui.images.IconLoader; >+import com.vividsolutions.jump.workbench.ui.swing.IconComponent; >+ >+public class InfoModelDetailPanel extends JPanel implements InfoModelAware, >+ InfoModelListener, IconComponent { >+ private Icon icon = IconLoader.icon("Attribute.gif"); >+ >+ private InfoModel infoModel; >+ >+ private FeatureViewPanel featureDetailPanel; >+ >+ private EnableableToolBar toolBar = new EnableableToolBar(); >+ >+ private int layerFeatureIndex = 0; >+ >+ private int featureIndex = 0; >+ >+ private int featureCount = 0; >+ >+ private Feature currentFeature; >+ >+ private JTextField featureIndexField; >+ >+ private JTextPane featureCountPane; >+ >+ public InfoModelDetailPanel(WorkbenchContext context) { >+ setToolTipText("Detail View"); >+ featureDetailPanel = new FeatureViewPanel(context); >+ >+ try { >+ jbInit(); >+ } catch (Exception ex) { >+ ex.printStackTrace(); >+ } >+ toolBar.add(new JButton(), I18N.get("ui.GeometryInfoTab.attributes"), >+ IconLoader.icon("Start.gif"), new ActionListener() { >+ public void actionPerformed(ActionEvent e) { >+ firstFeature(); >+ } >+ }, new BooleanPropertyEnableCheck(this, "isAtFirst", false)); >+ toolBar.add(new JButton(), I18N.get("ui.GeometryInfoTab.attributes"), >+ IconLoader.icon("Prev.gif"), new ActionListener() { >+ public void actionPerformed(ActionEvent e) { >+ previousFeature(); >+ } >+ }, new BooleanPropertyEnableCheck(this, "isAtFirst", false)); >+ toolBar.add(new JButton(), I18N.get("ui.GeometryInfoTab.attributes"), >+ IconLoader.icon("Next.gif"), new ActionListener() { >+ public void actionPerformed(ActionEvent e) { >+ nextFeature(); >+ } >+ }, new BooleanPropertyEnableCheck(this, "isAtLast", false)); >+ toolBar.add(new JButton(), I18N.get("ui.GeometryInfoTab.attributes"), >+ IconLoader.icon("End.gif"), new ActionListener() { >+ public void actionPerformed(ActionEvent e) { >+ lastFeature(); >+ } >+ }, new BooleanPropertyEnableCheck(this, "isAtLast", false)); >+ featureIndexField = new JTextField(); >+ toolBar.add(featureIndexField); >+ featureCountPane = new JTextPane(); >+ toolBar.add(featureCountPane); >+ >+ } >+ >+ public boolean isAtFirst() { >+ return featureIndex == 0; >+ } >+ >+ public boolean isAtLast() { >+ return featureIndex >= featureCount - 1; >+ } >+ >+ protected void firstFeature() { >+ setSelectedFeature(0); >+ } >+ >+ protected void previousFeature() { >+ setSelectedFeature(featureIndex - 1); >+ } >+ >+ protected void nextFeature() { >+ setSelectedFeature(featureIndex + 1); >+ } >+ >+ protected void lastFeature() { >+ setSelectedFeature(featureCount - 1); >+ } >+ >+ private void updateText() { >+ featureDetailPanel.updateText(); >+ } >+ >+ void jbInit() throws Exception { >+ setLayout(new BorderLayout()); >+ add(featureDetailPanel, BorderLayout.CENTER); >+ add(toolBar, BorderLayout.NORTH); >+ } >+ >+ public InfoModel getInfoModel() { >+ return infoModel; >+ } >+ >+ public void setInfoModel(InfoModel model) { >+ this.infoModel = model; >+ model.addListener(this); >+ for (Iterator layers = infoModel.getLayers().iterator(); >layers.hasNext();) { >+ Layer layer = (Layer)layers.next(); >+ LayerTableModel layerModel = infoModel.getTableModel(layer); >+ layerAdded(layerModel); >+ } >+ firstFeature(); >+ } >+ >+ public void layerAdded(LayerTableModel layerTableModel) { >+ int rowCount = layerTableModel.getRowCount(); >+ featureCount += rowCount; >+ if (featureCount == rowCount) { >+ setSelectedFeature(0); >+ } else { >+ update(); >+ } >+ } >+ >+ public void layerRemoved(LayerTableModel layerTableModel) { >+ int rowCount = layerTableModel.getRowCount(); >+ int layerIndex = 0; >+ boolean finish = false; >+ featureCount -= rowCount; >+ Iterator layers = infoModel.getLayers().iterator(); >+ while (layers.hasNext() && !finish) { >+ Layer layer = (Layer)layers.next(); >+ LayerTableModel layerModel = infoModel.getTableModel(layer); >+ if (featureIndex < layerIndex) { >+ finish = true; >+ } else if (layerModel == layerTableModel) { >+ featureIndex -= rowCount - 1; >+ if (featureIndex < layerIndex) { >+ featureIndex = layerIndex; >+ } >+ if (featureIndex >= featureCount) { >+ featureIndex = 0; >+ } >+ layerFeatureIndex = 0; >+ finish = true; >+ } else { >+ layerIndex += layerModel.getRowCount(); >+ } >+ } >+ setSelectedFeature(featureIndex); >+ } >+ >+ private void setSelectedFeature(final int i) { >+ boolean found = false; >+ if (featureCount != 0) { >+ if (i >= featureCount) { >+ if (featureCount == 0) { >+ featureIndex = 0; >+ } else { >+ featureIndex = featureCount - 1; >+ } >+ } else if (i <= 0) { >+ featureIndex = 0; >+ } else { >+ featureIndex = i; >+ } >+ int layerIndex = 0; >+ Iterator layers = infoModel.getLayers().iterator(); >+ while (layers.hasNext() && !found) { >+ Layer layer = (Layer)layers.next(); >+ LayerTableModel layerModel = infoModel.getTableModel(layer); >+ >+ int layerRows = layerModel.getRowCount(); >+ if (featureIndex < layerIndex + layerRows) { >+ layerFeatureIndex = featureIndex - layerIndex; >+ currentFeature = layerModel.getFeature(layerFeatureIndex); >+ featureDetailPanel.setLayer(layer); >+ featureDetailPanel.setFeature(currentFeature); >+ update(); >+ found = true; >+ } else { >+ layerIndex += layerRows; >+ } >+ } >+ } >+ if (!found) { >+ currentFeature = null; >+ featureDetailPanel.setFeature(null); >+ update(); >+ } >+ } >+ >+ private void update() { >+ if (currentFeature != null) { >+ featureDetailPanel.setFeature(currentFeature); >+ featureIndexField.setText(String.valueOf(featureIndex + 1)); >+ featureCountPane.setText(" of " + featureCount); >+ } else { >+ featureDetailPanel.setFeature(null); >+ featureIndexField.setText("0"); >+ featureCountPane.setText(" of 0"); >+ } >+ toolBar.updateEnabledState(); >+ } >+ >+ /** >+ * @return the icon >+ */ >+ public Icon getIcon() { >+ return icon; >+ } >+ >+ /** >+ * @param icon the icon to set >+ */ >+ public void setIcon(Icon icon) { >+ this.icon = icon; >+ } >+ >+} >Index: >src/com/vividsolutions/jump/workbench/ui/swing/WorkbenchContextComponentFactory.java >=================================================================== >RCS file: >src/com/vividsolutions/jump/workbench/ui/swing/WorkbenchContextComponentFactory.java >diff -N >src/com/vividsolutions/jump/workbench/ui/swing/WorkbenchContextComponentFactory.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ >src/com/vividsolutions/jump/workbench/ui/swing/WorkbenchContextComponentFactory.java > 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,44 @@ >+package com.vividsolutions.jump.workbench.ui.swing; >+ >+import java.lang.reflect.Constructor; >+ >+import javax.swing.JComponent; >+ >+import com.vividsolutions.jump.workbench.WorkbenchContext; >+ >+public class WorkbenchContextComponentFactory implements ComponentFactory { >+ private Class componentClass; >+ >+ private WorkbenchContext context; >+ >+ private Constructor constructor; >+ >+ public WorkbenchContextComponentFactory(Class componentClass, >+ WorkbenchContext context) { >+ this.componentClass = componentClass; >+ this.context = context; >+ try { >+ constructor = componentClass.getConstructor(new Class[] { >+ WorkbenchContext.class >+ }); >+ } catch (Throwable e) { >+ throw new RuntimeException(componentClass >+ + " must have a constructor with argument " + WorkbenchContext.class, >e); >+ } >+ } >+ >+ public JComponent createComponent() { >+ try { >+ return (JComponent)constructor.newInstance(new Object[] { >+ context >+ }); >+ } catch (RuntimeException e) { >+ throw e; >+ } catch (Error e) { >+ throw e; >+ } catch (Exception e) { >+ throw new RuntimeException("Unable to construct " + componentClass, e); >+ } >+ } >+ >+} >Index: src/org/openjump/core/ui/builder/UiBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/UiBuilder.java >diff -N src/org/openjump/core/ui/builder/UiBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/UiBuilder.java 1 Jan 1970 00:00:00 >-0000 >@@ -0,0 +1,10 @@ >+package org.openjump.core.ui.builder; >+ >+public interface UiBuilder { >+ void appendHtml(StringBuffer s, Object object); >+ String toHtml(Object object); >+ >+ UiBuilderRegistry getRegistry(); >+ void setRegistry(UiBuilderRegistry registry); >+ >+} >Index: src/org/openjump/core/ui/builder/UiBuilderRegistry.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/UiBuilderRegistry.java >diff -N src/org/openjump/core/ui/builder/UiBuilderRegistry.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/UiBuilderRegistry.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,71 @@ >+package org.openjump.core.ui.builder; >+ >+import java.util.HashMap; >+import java.util.LinkedHashMap; >+import java.util.Map; >+ >+import com.vividsolutions.jump.util.Blackboard; >+import com.vividsolutions.jump.workbench.WorkbenchContext; >+ >+public class UiBuilderRegistry { >+ private static final String BLACKBOARD_KEY = >UiBuilderRegistry.class.getName(); >+ >+ private static final StringUiBuilder DEFAULT_RENDERER = new >StringUiBuilder(); >+ >+ private Map renderers = new LinkedHashMap(); >+ >+ public static UiBuilderRegistry getInstance(WorkbenchContext context) { >+ Blackboard blackboard = context.getBlackboard(); >+ UiBuilderRegistry repository = >(UiBuilderRegistry)blackboard.get(BLACKBOARD_KEY); >+ if (repository == null) { >+ repository = new UiBuilderRegistry(); >+ blackboard.put(BLACKBOARD_KEY, repository); >+ } >+ return repository; >+ } >+ >+ public void addRenderer(Class clazz, UiBuilder builder) { >+ renderers.put(clazz, builder); >+ builder.setRegistry(this); >+ } >+ >+ public UiBuilder getRenderer(Class clazz) { >+ UiBuilder renderer = getRendererPrivate(clazz); >+ if (renderer != null) { >+ return renderer; >+ } else { >+ return DEFAULT_RENDERER; >+ } >+ } >+ >+ private UiBuilder getRendererPrivate(Class clazz) { >+ if (clazz != null) { >+ UiBuilder renderer = (UiBuilder)renderers.get(clazz); >+ if (renderer == null) { >+ Class superClass = clazz.getSuperclass(); >+ if (superClass != Object.class) { >+ renderer = getRendererPrivate(superClass); >+ } >+ Class[] interfaces = clazz.getInterfaces(); >+ for (int i = 0; i < interfaces.length && renderer == null; i++) { >+ Class interfaceClass = interfaces[i]; >+ renderer = getRendererPrivate(interfaceClass); >+ } >+ } >+ return renderer; >+ } else { >+ return null; >+ } >+ } >+ >+ public String toHtml(Object object) { >+ if (object != null) { >+ Class objectClass = object.getClass(); >+ UiBuilder renderer = getRenderer(objectClass); >+ String html = renderer.toHtml(object); >+ return html; >+ } else { >+ return null; >+ } >+ } >+} >Index: >src/org/openjump/core/ui/plugin/enablecheck/BooleanPropertyEnableCheck.java >=================================================================== >RCS file: >src/org/openjump/core/ui/plugin/enablecheck/BooleanPropertyEnableCheck.java >diff -N >src/org/openjump/core/ui/plugin/enablecheck/BooleanPropertyEnableCheck.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ >src/org/openjump/core/ui/plugin/enablecheck/BooleanPropertyEnableCheck.java > 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,61 @@ >+package org.openjump.core.ui.plugin.enablecheck; >+ >+import java.lang.reflect.Method; >+ >+import javax.swing.JComponent; >+ >+import com.vividsolutions.jump.workbench.plugin.EnableCheck; >+ >+public class BooleanPropertyEnableCheck implements EnableCheck { >+ String disabledMessage = ""; >+ >+ /** The check method. */ >+ private Method method; >+ >+ /** The object to invoke the method on.*/ >+ private Object object; >+ >+ /** The expected value to be returned for the check to be enabled. */ >+ private boolean expectedValue; >+ >+ /** >+ * >+ * @param object The object to invoke the method on. >+ * @param checkMethodName The name of the check method which returns a >boolean value. >+ */ >+ public BooleanPropertyEnableCheck(final Object object, final String >checkMethodName) { >+ this(object, checkMethodName, true); >+ } >+ >+ /** >+ * >+ * @param object The object to invoke the method on. >+ * @param checkMethodName The name of the check method which returns a >boolean value. >+ * @param expectedValue The expected value to be returned for the check to >be enabled. >+ */ >+ public BooleanPropertyEnableCheck(final Object object, final String >checkMethodName, final boolean expectedValue) { >+ Class clazz = object.getClass(); >+ this.object = object; >+ this.expectedValue = expectedValue; >+ try { >+ method = clazz.getMethod(checkMethodName, new Class[] {}); >+ } catch (Throwable e) { >+ throw new IllegalArgumentException("Unable to get check method " >+ + checkMethodName + " on " + clazz); >+ } >+ } >+ >+ public String check(JComponent component) { >+ try { >+ Boolean result = (Boolean)method.invoke(object, new Object[0]); >+ if (result.booleanValue() == expectedValue) { >+ return null; >+ } else { >+ return disabledMessage; >+ } >+ } catch (Throwable e) { >+ e.printStackTrace(); >+ return e.getMessage(); >+ } >+ } >+} >Index: src/org/openjump/core/ui/builder/DateTimeUiBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/DateTimeUiBuilder.java >diff -N src/org/openjump/core/ui/builder/DateTimeUiBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/DateTimeUiBuilder.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,23 @@ >+package org.openjump.core.ui.builder; >+ >+import java.text.DateFormat; >+import java.text.SimpleDateFormat; >+import java.util.Date; >+ >+import com.vividsolutions.jump.workbench.ui.GUIUtil; >+ >+public class DateTimeUiBuilder extends AbstractUiBuilder { >+ >+ public void appendHtml(StringBuffer s, Object object) { >+ if (object instanceof Date) { >+ Date date = (Date)object; >+ DateFormat format = getDateFormat(); >+ s.append(GUIUtil.escapeHTML(format.format(date), false, false)); >+ } >+ >+ } >+ >+ protected DateFormat getDateFormat() { >+ return SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.MEDIUM, >SimpleDateFormat.MEDIUM); >+ } >+} >Index: src/org/openjump/core/ui/builder/DateUIBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/DateUIBuilder.java >diff -N src/org/openjump/core/ui/builder/DateUIBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/DateUIBuilder.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,14 @@ >+package org.openjump.core.ui.builder; >+ >+import java.text.DateFormat; >+import java.text.SimpleDateFormat; >+import java.util.Date; >+ >+import com.vividsolutions.jump.workbench.ui.GUIUtil; >+ >+public class DateUIBuilder extends DateTimeUiBuilder { >+ >+ protected DateFormat getDateFormat() { >+ return SimpleDateFormat.getDateInstance(SimpleDateFormat.MEDIUM); >+ } >+} >Index: src/org/openjump/core/ui/builder/FeatureUiBuilder.java >=================================================================== >RCS file: src/org/openjump/core/ui/builder/FeatureUiBuilder.java >diff -N src/org/openjump/core/ui/builder/FeatureUiBuilder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/openjump/core/ui/builder/FeatureUiBuilder.java 1 Jan 1970 >00:00:00 -0000 >@@ -0,0 +1,114 @@ >+package org.openjump.core.ui.builder; >+ >+import com.vividsolutions.jts.geom.Geometry; >+import com.vividsolutions.jump.feature.Feature; >+import com.vividsolutions.jump.feature.FeatureSchema; >+import com.vividsolutions.jump.workbench.ui.GUIUtil; >+ >+public class FeatureUiBuilder extends AbstractUiBuilder { >+ private static final String TABLE_STYLE = "width: 100%;font-family: Tahoma, >Arial, sans-serif;font-size: 10pt;padding: 0px;border-collapse: collapse;"; >+ >+ private static final String TABLE_ATTRS = "style=\"" + TABLE_STYLE + "\" "; >+ >+ private static final String TABLE_HEADING_STYLE = "vertical-align: >top;text-align: left;padding: 1px 2px;width: auto;"; >+ >+ private static final String TABLE_HEADING_ODD_ATTRS = >"style=\"background-color: #FFFFFF;" >+ + TABLE_HEADING_STYLE + "\""; >+ >+ private static final String TABLE_HEADING_EVEN_ATTRS = >"style=\"background-color: #E6E6E6;" >+ + TABLE_HEADING_STYLE + "\""; >+ >+ private static final String TABLE_CELL_STYLE = "vertical-align: >top;text-align: left;border-left: 1px solid black;padding: 0px;"; >+ >+ private static final String TABLE_CELL_ODD_ATTRS = >"style=\"background-color: #FFFFFF;" >+ + TABLE_CELL_STYLE + "\""; >+ >+ private static final String TABLE_CELL_EVEN_ATTRS = >"style=\"background-color: #E6E6E6;" >+ + TABLE_CELL_STYLE + "\""; >+ >+ private static final String SPAN_ATTRS = "style=\"padding: 1px 2px;\""; >+ >+ private static final String TYPE_TITLE_ATTRS = "style=\"font-size: >12pt;font-weight:bold;padding: 1px 2px;background-color:#FFFFCC\""; >+ >+ public FeatureUiBuilder() { >+ } >+ >+ public void appendHtml(StringBuffer s, Object object) { >+ appendHtml(s, object, true); >+ } >+ >+ public void appendHtml(StringBuffer s, Object object, boolean nested) { >+ if (object instanceof Feature) { >+ Feature feature = (Feature)object; >+ FeatureSchema schema = feature.getSchema(); >+ if (nested) { >+ String schemaName = schema.getName(); >+ if (schemaName != null) { >+ appendValue(s, schemaName, TYPE_TITLE_ATTRS); >+ } >+ } >+ s.append("<table ").append(TABLE_ATTRS).append(">\n"); >+ boolean odd = true; >+ if (!nested) { >+ appendRow(s, true, "FID", String.valueOf(feature.getID())); >+ odd = !odd; >+ } >+ for (int i = 0; i < schema.getAttributeCount(); i++) { >+ Object value = feature.getAttribute(i); >+ if (value instanceof Geometry) { >+ continue; >+ } >+ String name = schema.getAttributeName(i); >+ appendRow(s, odd, name, value); >+ odd = !odd; >+ } >+ s.append("</table>\n"); >+ } >+ } >+ >+ private void appendRow(StringBuffer s, boolean odd, String name, Object >value) { >+ if (odd) { >+ s.append("<tr valign=\"top\" class=\"odd\"><th ").append( >+ TABLE_HEADING_ODD_ATTRS).append(">"); >+ } else { >+ s.append("<tr valign=\"top\" class=\"even\"><th ").append( >+ TABLE_HEADING_EVEN_ATTRS).append(">"); >+ } >+ appendEscaped(s, name); >+ s.append("</th>\n"); >+ if (odd) { >+ s.append("<td ").append(TABLE_CELL_ODD_ATTRS).append(">"); >+ } else { >+ s.append("<td ").append(TABLE_CELL_EVEN_ATTRS).append(">"); >+ } >+ appendValue(s, value); >+ s.append("</td></tr>\n"); >+ } >+ >+ private void appendValue(StringBuffer s, Object value) { >+ String style = SPAN_ATTRS; >+ s.append("<div>"); >+ if (value == null) { >+ s.append("-"); >+ } else { >+ String string = getRegistry().toHtml(value); >+ s.append(string); >+ } >+ s.append("</div>"); >+ } >+ >+ private void appendValue(StringBuffer s, String value, String style) { >+ s.append("<div ").append(style).append(">"); >+ if (value == null) { >+ s.append("-"); >+ } else { >+ appendEscaped(s, value); >+ } >+ s.append("</div>"); >+ } >+ >+ private void appendEscaped(StringBuffer s, String value) { >+ s.append(GUIUtil.escapeHTML(value, false, false)); >+ } >+ >+} >Index: src/com/vividsolutions/jump/workbench/ui/swing/IconComponent.java >=================================================================== >RCS file: src/com/vividsolutions/jump/workbench/ui/swing/IconComponent.java >diff -N src/com/vividsolutions/jump/workbench/ui/swing/IconComponent.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/com/vividsolutions/jump/workbench/ui/swing/IconComponent.java 1 Jan >1970 00:00:00 -0000 >@@ -0,0 +1,10 @@ >+package com.vividsolutions.jump.workbench.ui.swing; >+ >+import javax.swing.Icon; >+ >+public interface IconComponent { >+ public Icon getIcon(); >+ >+ public void setIcon(Icon icon); >+ >+} > > >------------------------------------------------------------------------ > >------------------------------------------------------------------------- >This SF.net email is sponsored by DB2 Express >Download DB2 Express C - the FREE version of DB2 express and take >control of your XML. No limits. Just data. Click to get it now. >http://sourceforge.net/powerbar/db2/ > >------------------------------------------------------------------------ > >_______________________________________________ >Jump-pilot-devel mailing list >Jump-pilot-devel@lists.sourceforge.net >https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel