You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(8) |
Nov
(12) |
Dec
(26) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(30) |
Feb
(51) |
Mar
(26) |
Apr
(32) |
May
(15) |
Jun
(17) |
Jul
(11) |
Aug
(33) |
Sep
(10) |
Oct
(28) |
Nov
(32) |
Dec
(6) |
2008 |
Jan
(36) |
Feb
(3) |
Mar
(23) |
Apr
(29) |
May
(37) |
Jun
(18) |
Jul
(5) |
Aug
(1) |
Sep
(1) |
Oct
(7) |
Nov
|
Dec
|
2009 |
Jan
(8) |
Feb
(2) |
Mar
(18) |
Apr
(18) |
May
(5) |
Jun
(10) |
Jul
(2) |
Aug
(6) |
Sep
|
Oct
(2) |
Nov
(2) |
Dec
|
From: <mar...@us...> - 2009-05-01 15:13:47
|
Revision: 635 http://fenggui.svn.sourceforge.net/fenggui/?rev=635&view=rev Author: marcmenghin Date: 2009-05-01 15:13:38 +0000 (Fri, 01 May 2009) Log Message: ----------- - upped version number Modified Paths: -------------- make/build.xml src/org/fenggui/FengGUI.java Modified: make/build.xml =================================================================== --- make/build.xml 2009-05-01 14:38:45 UTC (rev 634) +++ make/build.xml 2009-05-01 15:13:38 UTC (rev 635) @@ -8,7 +8,7 @@ <!-- Define base values --> <property name="SVNRevision" value="634" /> - <property name="version" value="ALPHA 12 (Rev ${SVNRevision})" /> + <property name="version" value="ALPHA 13 SVN (Rev ${SVNRevision})" /> <property name="name" value="FengGUI" /> <property name="websiten" value="http://www.fenggui.org" /> Modified: src/org/fenggui/FengGUI.java =================================================================== --- src/org/fenggui/FengGUI.java 2009-05-01 14:38:45 UTC (rev 634) +++ src/org/fenggui/FengGUI.java 2009-05-01 15:13:38 UTC (rev 635) @@ -43,7 +43,7 @@ public class FengGUI { //Basic FengGUI information for others to read out. - public static final String VERSION = "Alpha 12"; + public static final String VERSION = "Alpha 13 SVN"; public static final String NAME = "FengGUI"; public static final String WEB = "http://www.fenggui.org"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-05-01 14:38:52
|
Revision: 634 http://fenggui.svn.sourceforge.net/fenggui/?rev=634&view=rev Author: marcmenghin Date: 2009-05-01 14:38:45 +0000 (Fri, 01 May 2009) Log Message: ----------- - release: Alpha 12 Modified Paths: -------------- make/build.xml src/org/fenggui/FengGUI.java Modified: make/build.xml =================================================================== --- make/build.xml 2009-04-25 09:54:13 UTC (rev 633) +++ make/build.xml 2009-05-01 14:38:45 UTC (rev 634) @@ -7,7 +7,8 @@ </description> <!-- Define base values --> - <property name="version" value="ALPHA 12" /> + <property name="SVNRevision" value="634" /> + <property name="version" value="ALPHA 12 (Rev ${SVNRevision})" /> <property name="name" value="FengGUI" /> <property name="websiten" value="http://www.fenggui.org" /> Modified: src/org/fenggui/FengGUI.java =================================================================== --- src/org/fenggui/FengGUI.java 2009-04-25 09:54:13 UTC (rev 633) +++ src/org/fenggui/FengGUI.java 2009-05-01 14:38:45 UTC (rev 634) @@ -43,7 +43,7 @@ public class FengGUI { //Basic FengGUI information for others to read out. - public static final String VERSION = "Alpha 12 SVN"; + public static final String VERSION = "Alpha 12"; public static final String NAME = "FengGUI"; public static final String WEB = "http://www.fenggui.org"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-25 09:54:14
|
Revision: 633 http://fenggui.svn.sourceforge.net/fenggui/?rev=633&view=rev Author: marcmenghin Date: 2009-04-25 09:54:13 +0000 (Sat, 25 Apr 2009) Log Message: ----------- - fixed a few problems with different examples - added a update method to the Text managers. - fixed TitledBorder border problem. Increased line size to 2 pixel for now so everyone sees a line. - fixed a NPE on ScrollContainers without a innerWidget set. Modified Paths: -------------- src/org/fenggui/ScrollContainer.java src/org/fenggui/TextEditor.java src/org/fenggui/decorator/border/TitledBorder.java src/org/fenggui/text/EditableTextContentManager.java src/org/fenggui/text/ITextContentManager.java src/org/fenggui/text/TextContentManager.java src/org/fenggui/text/content/ContentManager.java test/org/fenggui/example/Everything.java test/org/fenggui/example/MultiLineLabelExample.java Modified: src/org/fenggui/ScrollContainer.java =================================================================== --- src/org/fenggui/ScrollContainer.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/ScrollContainer.java 2009-04-25 09:54:13 UTC (rev 633) @@ -184,7 +184,8 @@ { public void sliderMoved(SliderMovedEvent sliderMovedEvent) { - placeInnerWidgetHorizontally(sliderMovedEvent.getPosition()); + if (innerWidget != null) + placeInnerWidgetHorizontally(sliderMovedEvent.getPosition()); } }); } @@ -195,7 +196,8 @@ { public void sliderMoved(SliderMovedEvent sliderMovedEvent) { - placeInnerWidgetVertically(sliderMovedEvent.getPosition()); + if (innerWidget != null) + placeInnerWidgetVertically(sliderMovedEvent.getPosition()); } }); } @@ -462,7 +464,12 @@ if (showScrollbars && displayHorizontalScrollBar) contentHeight -= horizontalScrollBar.getHeight(); - return innerWidget.getSize().getHeight() - contentHeight; + if (innerWidget == null) + { + return contentHeight; + } else { + return innerWidget.getSize().getHeight() - contentHeight; + } } /** Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/TextEditor.java 2009-04-25 09:54:13 UTC (rev 633) @@ -625,7 +625,18 @@ // } } + /* (non-Javadoc) + * @see org.fenggui.StandardWidget#updateMinSize() + */ @Override + public void updateMinSize() + { + textData.Update(getAppearance()); + emptyData.Update(getAppearance()); + super.updateMinSize(); + } + + @Override public Dimension getMinContentSize() { Dimension size = textData.getSize(); @@ -760,7 +771,7 @@ * @see org.fenggui.StatefullWidget#clone() */ @Override - public StatefullWidget<TextAppearance> clone() + public TextEditor clone() { TextEditor result = (TextEditor) super.clone(); Modified: src/org/fenggui/decorator/border/TitledBorder.java =================================================================== --- src/org/fenggui/decorator/border/TitledBorder.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/decorator/border/TitledBorder.java 2009-04-25 09:54:13 UTC (rev 633) @@ -108,23 +108,23 @@ final int OFFSET = 2; int halfFontSize = font.getHeight() / 2; + int topPosY = localY + height - halfFontSize - OFFSET; + + // left + g.setLineWidth(2); //so everyone should be able to see a line - // left - g.setLineWidth(1); - g.drawLine(localX + OFFSET, localY, localX + OFFSET, localY + height - halfFontSize - OFFSET); + g.drawLine(localX, localY, localX, topPosY); // right - g.drawLine(localX + width - getRight(), localY, localX + width - getRight(), localY + height - halfFontSize - - OFFSET + 1); + g.drawLine(localX + width - getRight(), localY, localX + width - getRight(), topPosY); // top - g.drawLine(localX, localY + height - halfFontSize - OFFSET, localX + 5, localY + height - halfFontSize - OFFSET); + g.drawLine(localX, topPosY, localX + 5, topPosY); - g.drawLine(localX + font.getWidth(title) + 15, localY + height - halfFontSize - OFFSET, localX + getLeft() - + width, localY + height - halfFontSize - OFFSET); + g.drawLine(localX + font.getWidth(title) + 15, topPosY, localX + getLeft() + width, topPosY); // bottom - g.drawLine(localX, localY + OFFSET, getLeft() + width + getRight(), localY + OFFSET); + g.drawLine(localX, localY, getLeft() + width + getRight(), localY); // set line width back to default g.setLineWidth(1); Modified: src/org/fenggui/text/EditableTextContentManager.java =================================================================== --- src/org/fenggui/text/EditableTextContentManager.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/text/EditableTextContentManager.java 2009-04-25 09:54:13 UTC (rev 633) @@ -667,4 +667,12 @@ manager.removeAll(appearance); manager.addContent(text, appearance); } + + /* (non-Javadoc) + * @see org.fenggui.text.ITextContentManager#Update(org.fenggui.appearance.TextAppearance) + */ + public void Update(TextAppearance appearance) + { + manager.updateContent(this.width, appearance); + } } Modified: src/org/fenggui/text/ITextContentManager.java =================================================================== --- src/org/fenggui/text/ITextContentManager.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/text/ITextContentManager.java 2009-04-25 09:54:13 UTC (rev 633) @@ -46,6 +46,8 @@ public String getContent(); + public void Update(TextAppearance appearance); + public boolean isEmpty(); /** Modified: src/org/fenggui/text/TextContentManager.java =================================================================== --- src/org/fenggui/text/TextContentManager.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/text/TextContentManager.java 2009-04-25 09:54:13 UTC (rev 633) @@ -294,4 +294,17 @@ { return this.content.length <= 0; } + + /* (non-Javadoc) + * @see org.fenggui.text.ITextContentManager#Update() + */ + public void Update(TextAppearance appearance) + { + Dimension oldSize = contentSizeCache; + + this.contentSizeCache = getRenderer(appearance).calculateSize(this.content); + + if (!oldSize.equals(contentSizeCache)) + fireSizeChangedListerer(new SizeChangedEvent(null, oldSize, contentSizeCache)); + } } Modified: src/org/fenggui/text/content/ContentManager.java =================================================================== --- src/org/fenggui/text/content/ContentManager.java 2009-04-22 22:27:27 UTC (rev 632) +++ src/org/fenggui/text/content/ContentManager.java 2009-04-25 09:54:13 UTC (rev 633) @@ -128,7 +128,7 @@ } } - private void update() + public void update() { int y = 0; int x = 0; Modified: test/org/fenggui/example/Everything.java =================================================================== --- test/org/fenggui/example/Everything.java 2009-04-22 22:27:27 UTC (rev 632) +++ test/org/fenggui/example/Everything.java 2009-04-25 09:54:13 UTC (rev 633) @@ -36,6 +36,9 @@ import org.fenggui.actor.SimpleWindowPositioningActor; import org.fenggui.binding.render.Binding; import org.fenggui.binding.render.Graphics; +import org.fenggui.binding.render.ImageFont; +import org.fenggui.binding.render.text.DirectTextRenderer; +import org.fenggui.binding.render.text.ITextRenderer; import org.fenggui.composite.GUIInspector; import org.fenggui.composite.MessageWindow; import org.fenggui.composite.Window; @@ -50,7 +53,6 @@ import org.fenggui.event.IDisplayResizedListener; import org.fenggui.event.IMenuItemPressedListener; import org.fenggui.event.MenuItemPressedEvent; -import org.fenggui.example.chat.ChatExample; import org.fenggui.layout.BorderLayout; import org.fenggui.layout.BorderLayoutData; import org.fenggui.layout.RowLayout; @@ -65,6 +67,7 @@ import org.fenggui.util.Color; import org.fenggui.util.Point; import org.fenggui.util.Spacing; +import org.fenggui.util.fonttoolkit.FontFactory; /** * Builds a simple frame with an ugly layout. Is mainly used to testing @@ -79,8 +82,9 @@ */ public class Everything implements IExample { - private Display display = null; - private boolean runAsWebstart = false; + private Display display = null; + private boolean runAsWebstart = false; + private ImageFont teleType = null; public Everything() { @@ -156,7 +160,7 @@ registerExample(new ClippingExample(), miscMenu, true); registerExample(new CursorExample(), miscMenu, true); - // registerExample(new SnappingSliderExample(), miscMenu, true); + // registerExample(new SnappingSliderExample(), miscMenu, true); Menu submen1Menu = FengGUI.createMenu(miscMenu, "Submenus", false); submen1Menu.addItem(new MenuItem("Submenu Item 1", false, menuBar.getAppearance())); @@ -178,7 +182,7 @@ registerExample(new PixmapDecoratorExample(), miscMenu, true); registerExample(new PopupMenuExample(), miscMenu, true); registerExample(new FileDialogExample(), miscMenu, true); - + Menu layoutMenu = FengGUI.createMenu(miscMenu, "Layouts", false); registerExample(new GridLayoutExample(), layoutMenu, true); registerExample(new LayoutExample(), layoutMenu, true); @@ -192,7 +196,7 @@ //registerExample(new ChatExample(), miscMenu, true); MenuItem guiInspectorItem = new MenuItem("GUI Inspector", menuBar.getAppearance()); -// miscMenu.addItem(guiInspectorItem); + // miscMenu.addItem(guiInspectorItem); guiInspectorItem.addMenuItemPressedListener(new IMenuItemPressedListener() { @@ -365,8 +369,6 @@ public void menuItemPressed(MenuItemPressedEvent menuItemPressedEvent) { - // if (teletype == null) - // teletype = FontFactory.renderStandardFont(new java.awt.Font("Monospace", java.awt.Font.PLAIN, 11)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); final XMLOutputStream os = new XMLOutputStream(bos, "Display", new GlobalContextHandler()); @@ -382,17 +384,18 @@ Window w = FengGUI.createWindow(display, true, false, false, true); w.getContentContainer().setLayoutManager(new BorderLayout()); - ScrollContainer sc = FengGUI.createScrollContainer(w.getContentContainer()); + ScrollContainer sc = FengGUI.createWidget(ScrollContainer.class); + w.getContentContainer().addWidget(sc); sc.setLayoutData(BorderLayoutData.CENTER); sc.setShowScrollbars(true); - final TextEditor te = FengGUI.createTextEditor(sc); + final TextEditor te = FengGUI.createWidget(TextEditor.class); sc.setInnerWidget(te); - // te.getAppearance().setFont(teletype); + te.setMultiline(true); + te.setWordWarping(false); te.setText(os.getDocument().toXML()); - // te.setm.setMultiline(true); - // te.getAppearance().getData().setWordWarping(false); - Container btnContainer = FengGUI.createContainer(w.getContentContainer()); + Container btnContainer = FengGUI.createWidget(Container.class); + w.getContentContainer().addWidget(btnContainer); btnContainer.setLayoutManager(new RowLayout(true)); Button dumpToConsole = FengGUI.createButton("Print on System.out"); Button clear = FengGUI.createButton("Clear"); @@ -436,12 +439,39 @@ w.setSize(500, 500); w.setTitle("XML Dump of Current Widget Tree"); w.layout(); + display.addWidget(w); StaticLayout.center(w, display); - display.addWidget(w); sc.scrollVertical(1.0d); //System.out.println(os.getDocument().toXML()); + + //add better font + if (teleType == null) + { + Widget wid = new Widget() + { + + public void paint(Graphics g) + { + display.removeWidget(this); + + if (teleType == null) + teleType = FontFactory.renderStandardFont(new java.awt.Font("Monospace", java.awt.Font.PLAIN, 11)); + + te.getAppearance().addRenderer(ITextRenderer.DEFAULTTEXTRENDERERKEY, new DirectTextRenderer(teleType)); + te.updateMinSize(); + } + }; + display.addWidget(wid); + } + else + { + te.getAppearance().addRenderer(ITextRenderer.DEFAULTTEXTRENDERERKEY, new DirectTextRenderer(teleType)); + te.updateMinSize(); + } + } }); + return xmlDump; } @@ -524,7 +554,7 @@ loadThemeDirect(filename, noTheme); buildMenuBar(); display.layout(); - + if (FengGUI.VERSION.indexOf("SVN") > 0) { showSVNInfoWindow(); Modified: test/org/fenggui/example/MultiLineLabelExample.java =================================================================== --- test/org/fenggui/example/MultiLineLabelExample.java 2009-04-22 22:27:27 UTC (rev 632) +++ test/org/fenggui/example/MultiLineLabelExample.java 2009-04-25 09:54:13 UTC (rev 633) @@ -33,7 +33,7 @@ { String text = "This is an example showing the behavior of the multiline label. This label has even more test text. Btw. this can be done everywhere text is displayed.\n\nmore text\n\neot"; - Window w = FengGUI.createWindow(display, true, false, false, true); + Window w = FengGUI.createWindow(true, false, false, true); w.setTitle(this.getExampleName()); Label l = FengGUI.createLabel(w.getContentContainer()); l.setMultiline(true); @@ -41,7 +41,9 @@ l.setText(text); l.updateMinSize(); - w.pack(); + w.setSize(200,250); + w.layout(); + display.addWidget(w); } public String getExampleDescription() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-22 22:27:42
|
Revision: 632 http://fenggui.svn.sourceforge.net/fenggui/?rev=632&view=rev Author: marcmenghin Date: 2009-04-22 22:27:27 +0000 (Wed, 22 Apr 2009) Log Message: ----------- - fixed missing theming of PopupMenuExample - fixed wrong window header size in TabContainerExample Modified Paths: -------------- test/org/fenggui/example/PopupMenuExample.java test/org/fenggui/example/TabContainerExample.java Modified: test/org/fenggui/example/PopupMenuExample.java =================================================================== --- test/org/fenggui/example/PopupMenuExample.java 2009-04-22 20:43:25 UTC (rev 631) +++ test/org/fenggui/example/PopupMenuExample.java 2009-04-22 22:27:27 UTC (rev 632) @@ -20,6 +20,7 @@ package org.fenggui.example; import org.fenggui.Display; +import org.fenggui.FengGUI; import org.fenggui.ObservableLabelWidget; import org.fenggui.appearance.LabelAppearance; import org.fenggui.composite.menu.Menu; @@ -60,12 +61,12 @@ l.setShrinkable(false); display.addWidget(l); - Menu secondMenu = new Menu(); + Menu secondMenu = FengGUI.createWidget(Menu.class); secondMenu.addItem(buildMenuItem(display, "Tomatos", secondMenu.getAppearance())); secondMenu.addItem(buildMenuItem(display, "Printer", secondMenu.getAppearance())); secondMenu.addItem(buildMenuItem(display, "Monitor", secondMenu.getAppearance())); - popupMenu = new Menu(); + popupMenu = FengGUI.createWidget(Menu.class); popupMenu.addItem(buildMenuItem(display, "First Entry", secondMenu.getAppearance())); popupMenu.addItem(buildMenuItem(display, "Second Entry", secondMenu.getAppearance())); popupMenu.addItem(buildMenuItem(display, "Third Entry", secondMenu.getAppearance())); Modified: test/org/fenggui/example/TabContainerExample.java =================================================================== --- test/org/fenggui/example/TabContainerExample.java 2009-04-22 20:43:25 UTC (rev 631) +++ test/org/fenggui/example/TabContainerExample.java 2009-04-22 22:27:27 UTC (rev 632) @@ -17,13 +17,19 @@ */ package org.fenggui.example; -import org.fenggui.*; +import org.fenggui.Button; +import org.fenggui.Container; +import org.fenggui.Display; +import org.fenggui.FengGUI; +import org.fenggui.FengGUIOptional; +import org.fenggui.Label; +import org.fenggui.TabContainer; +import org.fenggui.TextEditor; import org.fenggui.composite.Window; import org.fenggui.decorator.background.PlainBackground; import org.fenggui.layout.BorderLayoutData; import org.fenggui.layout.GridLayout; import org.fenggui.layout.RowLayout; -import org.fenggui.util.Alignment; import org.fenggui.util.Color; import org.fenggui.util.Spacing; @@ -32,30 +38,30 @@ public void buildGUI(Display display) { - Window w = FengGUI.createWindow(display, true, false, false, true); - + Window w = FengGUI.createWindow(true, false, false, true); + w.setTitle(this.getExampleName()); + TabContainer tabContainer = FengGUIOptional.createTabContainer(w.getContentContainer()); - Label l2 = FengGUI.createLabel("Other tab (2)"); + Label l2 = FengGUI.createLabel("Other tab (3)"); l2.getAppearance().add(new PlainBackground(Color.GREEN)); - l2.getAppearance().setAlignment(Alignment.MIDDLE); - Label l3 = FengGUI.createLabel("Yen another tab (3)"); + Label l3 = FengGUI.createLabel("Yen another tab (4)"); l3.getAppearance().add(new PlainBackground(Color.CYAN)); - l3.getAppearance().setAlignment(Alignment.MIDDLE); tabContainer.addTab("Login", null, buildLoginTab()); tabContainer.addTab("Buttons", null, buildButtonTab()); - tabContainer.addTab("Tab 3", null, l3); + tabContainer.addTab("Tab 3", null, l2); + tabContainer.addTab("Tab 4", null, l3); - w.setXY(10, 10); - w.setSize(200, 200); + w.setSize(250, 250); + display.addWidget(w); w.layout(); } private Container buildButtonTab() { - Container c = FengGUI.createContainer(); + Container c = FengGUI.createWidget(Container.class); c.setLayoutManager(new GridLayout(2, 2)); FengGUI.createButton(c, "B1"); FengGUI.createButton(c, "B2"); @@ -68,17 +74,21 @@ private Container buildLoginTab() { - Container k = FengGUI.createContainer(); + Container k = FengGUI.createWidget(Container.class); k.setLayoutManager(new RowLayout(false)); - Container c = FengGUI.createContainer(k); - c.setLayoutManager(new GridLayout(2, 1)); + Container c = FengGUI.createWidget(Container.class); + c.setLayoutManager(new GridLayout(2, 2)); FengGUI.createLabel(c, "Name:"); - //c.addWidget(new TextEditor(false)); + c.addWidget(FengGUI.createWidget(TextEditor.class)); FengGUI.createLabel(c, "Password:"); - //c.addWidget(new TextEditor(false)); + c.addWidget(FengGUI.createWidget(TextEditor.class)); c.setLayoutData(BorderLayoutData.CENTER); - + c.setExpandable(false); + c.setShrinkable(false); + c.setSize(150,100); + k.addWidget(c); + Button b = FengGUI.createButton(k, " Login "); b.getAppearance().setMargin(new Spacing(5, 5)); b.setSizeToMinSize(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-22 20:43:28
|
Revision: 631 http://fenggui.svn.sourceforge.net/fenggui/?rev=631&view=rev Author: marcmenghin Date: 2009-04-22 20:43:25 +0000 (Wed, 22 Apr 2009) Log Message: ----------- - fix missing triangle for submenus in minsize calculation Modified Paths: -------------- src/org/fenggui/composite/menu/Menu.java Modified: src/org/fenggui/composite/menu/Menu.java =================================================================== --- src/org/fenggui/composite/menu/Menu.java 2009-04-22 20:34:09 UTC (rev 630) +++ src/org/fenggui/composite/menu/Menu.java 2009-04-22 20:43:25 UTC (rev 631) @@ -518,8 +518,15 @@ { Dimension size = item.getPreferredSize(); - minWidth = Math.max(minWidth, size.getWidth()); - minHeight += size.getHeight(); + if (item.menu != null) + { + minWidth = Math.max(minWidth, size.getWidth() + 9); + minHeight += Math.max(size.getHeight(), 14); + } else { + minWidth = Math.max(minWidth, size.getWidth()); + minHeight += size.getHeight(); + } + } return new Dimension(minWidth, minHeight); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-22 20:34:19
|
Revision: 630 http://fenggui.svn.sourceforge.net/fenggui/?rev=630&view=rev Author: marcmenghin Date: 2009-04-22 20:34:09 +0000 (Wed, 22 Apr 2009) Log Message: ----------- - some logging improvements and more usage of new logging - fix: problem that list gets confused by trying to dragg an item Modified Paths: -------------- src/org/fenggui/Container.java src/org/fenggui/List.java src/org/fenggui/actor/SimpleWindowPositioningActor.java src/org/fenggui/binding/render/ImageFont.java src/org/fenggui/composite/Window.java src/org/fenggui/composite/menu/Menu.java src/org/fenggui/decorator/switches/SetPixmapSwitch.java src/org/fenggui/theme/XMLTheme.java src/org/fenggui/theme/xml/XMLInputStream.java src/org/fenggui/util/DefaultLogSystem.java Modified: src/org/fenggui/Container.java =================================================================== --- src/org/fenggui/Container.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/Container.java 2009-04-22 20:34:09 UTC (rev 630) @@ -36,6 +36,7 @@ import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.theme.xml.MissingElementException; import org.fenggui.util.Dimension; +import org.fenggui.util.Log; /** * A Container is a set of Widgets. The layout manager that is @@ -324,7 +325,7 @@ if (notifyList.contains(c)) { - System.err.println("Container.addWidget: Widget " + c + " is already in the container (" + this + ")"); + Log.warn("Container.addWidget: Widget " + c + " is already in the container (" + this + ")"); } else { Modified: src/org/fenggui/List.java =================================================================== --- src/org/fenggui/List.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/List.java 2009-04-22 20:34:09 UTC (rev 630) @@ -137,6 +137,29 @@ updateMinSize(); } + private void updateHoveredItem(int y, int mouseY) + { + hoveredItem = null; + mouseOverRow = -1; + int currentY = y; + + if (mouseY >= currentY) //only if over a item + { + for (int i = (items.size() - 1); i >= 0; i--) + { + Item item = items.get(i); + currentY += item.getPreferredSize().getHeight(); + + if (mouseY <= currentY) + { + hoveredItem = item; + mouseOverRow = i; + break; + } + } + } + } + @Override public void process(InputOutputStream stream) throws IOException, IXMLStreamableException { @@ -157,24 +180,8 @@ int frombottom = this.getSize().getHeight() - this.getMinSize().getHeight(); int currentY = frombottom > 0 ? frombottom : 0; - hoveredItem = null; - mouseOverRow = -1; - - if (mouseY >= currentY) //only if over a item - { - for (int i = (items.size() - 1); i >= 0; i--) - { - Item item = items.get(i); - currentY += item.getPreferredSize().getHeight(); - - if (mouseY <= currentY) - { - hoveredItem = item; - mouseOverRow = i; - break; - } - } - } + updateHoveredItem(currentY, mouseY); + super.mouseMoved(displayX, displayY); } @@ -304,6 +311,12 @@ @Override public void mouseClicked(MouseClickedEvent event) { + int mouseY = event.getLocalY(this); + int frombottom = this.getSize().getHeight() - this.getMinSize().getHeight(); + int currentY = frombottom > 0 ? frombottom : 0; + + updateHoveredItem(currentY, mouseY); + setSelectedIndex(mouseOverRow); super.mouseClicked(event); } Modified: src/org/fenggui/actor/SimpleWindowPositioningActor.java =================================================================== --- src/org/fenggui/actor/SimpleWindowPositioningActor.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/actor/SimpleWindowPositioningActor.java 2009-04-22 20:34:09 UTC (rev 630) @@ -28,6 +28,7 @@ import org.fenggui.event.WidgetListChangedEvent; import org.fenggui.layout.StaticLayout; import org.fenggui.util.Dimension; +import org.fenggui.util.Log; import org.fenggui.util.Point; import org.fenggui.util.Spacing; @@ -146,7 +147,7 @@ if (reader != null) padding = reader.getSpacing(); else if (padding == null) - System.err.println("No padding defined in SimpleWindowPositioningActor!"); + Log.error("No padding defined in SimpleWindowPositioningActor!"); // if no window is present position in center if (!hasWindows()) Modified: src/org/fenggui/binding/render/ImageFont.java =================================================================== --- src/org/fenggui/binding/render/ImageFont.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/binding/render/ImageFont.java 2009-04-22 20:34:09 UTC (rev 630) @@ -41,6 +41,7 @@ import org.fenggui.util.CharacterPixmap; import org.fenggui.util.Dimension; import org.fenggui.util.FontSAXHandler; +import org.fenggui.util.Log; import org.fenggui.util.fonttoolkit.FontFactory; import org.xml.sax.SAXException; @@ -199,7 +200,7 @@ buffer.append("</Font>"); FileOutputStream fileOut = new FileOutputStream(descriptionFilename, false); OutputStreamWriter out = new OutputStreamWriter(fileOut, "UTF-8"); - System.out.println("Writing description file with encoding " + out.getEncoding()); + Log.warn("Writing description file with encoding " + out.getEncoding()); out.write(buffer.toString()); out.close(); } Modified: src/org/fenggui/composite/Window.java =================================================================== --- src/org/fenggui/composite/Window.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/composite/Window.java 2009-04-22 20:34:09 UTC (rev 630) @@ -218,7 +218,7 @@ { public void buttonPressed(ButtonPressedEvent e) { - System.err.println("Minimize Window: Not implemented yet"); + throw new UnsupportedOperationException("Minimize Window: Not implemented yet"); } }); @@ -235,7 +235,7 @@ { public void buttonPressed(ButtonPressedEvent e) { - System.err.println("Maximize Window: Not implemented yet"); + throw new UnsupportedOperationException("Maximize Window: Not implemented yet"); } }); } Modified: src/org/fenggui/composite/menu/Menu.java =================================================================== --- src/org/fenggui/composite/menu/Menu.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/composite/menu/Menu.java 2009-04-22 20:34:09 UTC (rev 630) @@ -42,6 +42,7 @@ import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Dimension; +import org.fenggui.util.Log; /** * Menu widget. A menu is a popup container. @@ -252,7 +253,7 @@ { if (nextMenu.equals(this)) { - System.out.println(this + " " + items.get(0).getText()); + Log.warn(this + " " + items.get(0).getText()); } nextMenu.closeForward(); Modified: src/org/fenggui/decorator/switches/SetPixmapSwitch.java =================================================================== --- src/org/fenggui/decorator/switches/SetPixmapSwitch.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/decorator/switches/SetPixmapSwitch.java 2009-04-22 20:34:09 UTC (rev 630) @@ -27,6 +27,7 @@ import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; +import org.fenggui.util.Log; /** * TODO rename to PixmapSwitch @@ -60,8 +61,7 @@ } catch (ClassCastException ex) { - System.err.println("widget is not of type IPixmapWidget!"); - ex.printStackTrace(); + Log.error("widget is not of type IPixmapWidget!", ex); } } Modified: src/org/fenggui/theme/XMLTheme.java =================================================================== --- src/org/fenggui/theme/XMLTheme.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/theme/XMLTheme.java 2009-04-22 20:34:09 UTC (rev 630) @@ -81,6 +81,7 @@ import org.fenggui.tooltip.LabelTooltipDecorator; import org.fenggui.tooltip.LabelTooltipManager; import org.fenggui.util.Color; +import org.fenggui.util.Log; import org.fenggui.util.jdom.Document; import org.fenggui.util.jdom.Element; import org.fenggui.util.jdom.Reader; @@ -263,8 +264,8 @@ if (type == null) { - System.err.println("Warning: " + widget.getClass().getCanonicalName() - + " is not registered in org.theme.XMLTheme.TYPE_REGISTRY"); + Log.warn(widget.getClass().getCanonicalName() + + " is not registered in org.theme.XMLTheme.TYPE_REGISTRY"); return; } @@ -272,7 +273,7 @@ if (el == null) { - System.err.println("Warning: <" + type + "> could not be found in theme definition file"); + Log.warn("<" + type + "> could not be found in theme definition file"); return; } @@ -305,7 +306,7 @@ { String warningsStr = stream.getWarningsAsString().trim(); if (warningsStr.length() > 0) - System.out.println(warningsStr); + Log.warn(warningsStr); warnings.addAll(stream.getWarnings()); } } Modified: src/org/fenggui/theme/xml/XMLInputStream.java =================================================================== --- src/org/fenggui/theme/xml/XMLInputStream.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/theme/xml/XMLInputStream.java 2009-04-22 20:34:09 UTC (rev 630) @@ -445,13 +445,13 @@ if (e == null && getContextHandler().getRootDocument() != null) { //use global document if not found on local level - System.err.println("Warning: <" + name + "> could not be found in local context. Searching global context now."); + Log.error("Warning: <" + name + "> could not be found in local context. Searching global context now."); Element el = getContextHandler().getRootDocument().getChild(name); if (el == null) { - System.err.println("Warning: <" + name + "> could not be found in theme definition file"); + Log.error("Warning: <" + name + "> could not be found in theme definition file"); return; } Modified: src/org/fenggui/util/DefaultLogSystem.java =================================================================== --- src/org/fenggui/util/DefaultLogSystem.java 2009-04-22 13:26:31 UTC (rev 629) +++ src/org/fenggui/util/DefaultLogSystem.java 2009-04-22 20:34:09 UTC (rev 630) @@ -40,7 +40,7 @@ */ public void error(String error, Object... vars) { - System.out.println("Error: " + String.format(error, vars)); + System.err.println("Error: " + String.format(error, vars)); } @@ -49,7 +49,8 @@ */ public void error(String error, Throwable ex, Object... vars) { - System.out.println("Error: " + String.format(error, vars) + "\n" + ex.toString()); + System.err.println("Error: " + String.format(error, vars)); + ex.printStackTrace(); } /* (non-Javadoc) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-22 13:26:37
|
Revision: 629 http://fenggui.svn.sourceforge.net/fenggui/?rev=629&view=rev Author: marcmenghin Date: 2009-04-22 13:26:31 +0000 (Wed, 22 Apr 2009) Log Message: ----------- - added new Alphabets to the ImageFont so they are usable over XML theming Modified Paths: -------------- src/org/fenggui/binding/render/ImageFont.java Modified: src/org/fenggui/binding/render/ImageFont.java =================================================================== --- src/org/fenggui/binding/render/ImageFont.java 2009-04-22 13:17:09 UTC (rev 628) +++ src/org/fenggui/binding/render/ImageFont.java 2009-04-22 13:26:31 UTC (rev 629) @@ -389,7 +389,11 @@ f = FontFactory.renderStandardFont(awtFont, antialiasing, Alphabet.GERMAN); else if (alphabetStr.equalsIgnoreCase("french")) f = FontFactory.renderStandardFont(awtFont, antialiasing, Alphabet.FRENCH); - + else if (alphabetStr.equalsIgnoreCase("danish")) + f = FontFactory.renderStandardFont(awtFont, antialiasing, Alphabet.DANISH); + else if (alphabetStr.equalsIgnoreCase("estonian")) + f = FontFactory.renderStandardFont(awtFont, antialiasing, Alphabet.ESTONIAN); + this.height = f.height; this.image = f.image; this.texHashMap = f.texHashMap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-22 13:17:20
|
Revision: 628 http://fenggui.svn.sourceforge.net/fenggui/?rev=628&view=rev Author: marcmenghin Date: 2009-04-22 13:17:09 +0000 (Wed, 22 Apr 2009) Log Message: ----------- - added Danish characters to Alphabet (thx Firecow) Modified Paths: -------------- src/org/fenggui/util/Alphabet.java Modified: src/org/fenggui/util/Alphabet.java =================================================================== --- src/org/fenggui/util/Alphabet.java 2009-04-15 14:01:06 UTC (rev 627) +++ src/org/fenggui/util/Alphabet.java 2009-04-22 13:17:09 UTC (rev 628) @@ -46,8 +46,13 @@ public static final Alphabet FRENCH = new Alphabet(new char[] { 0x00C0, 0x00C2, 0x00C6, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CE, 0x00CF, 0x00D4, 0x0152, 0x00D9, 0x00DB, 0x00DC, 0x0178, 0x00C7, 0x00E0, 0x00E2, 0x00E6, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EE, 0x00EF, 0x00F4, 0x0153, 0x00F9, 0x00FB, 0x00FC, 0x00FF, 0x00E7 }); + public static final Alphabet ESTONIAN = new Alphabet(new char[] { 0x00F6, 0x00E4, 0x00F5, 0x00FC, 0x00D6, 0x00C4, 0x00D5, 0x00DC }); + + /* see http://www.geocities.com/click2speak/unicode/chars_da.html */ + public static final Alphabet DANISH = new Alphabet(new char[] { 0x00C6, 0x00C5, 0x00D8, 0x00E6, 0x00E5, 0x00F8}); + /** * Default Alphabet. It can be set by user through the setDefaultAlphabet method */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-15 14:01:17
|
Revision: 627 http://fenggui.svn.sourceforge.net/fenggui/?rev=627&view=rev Author: marcmenghin Date: 2009-04-15 14:01:06 +0000 (Wed, 15 Apr 2009) Log Message: ----------- - fix textEditor not firing TextChanged event on special keys (Backspace, Delete) Modified Paths: -------------- src/org/fenggui/TextEditor.java Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-04-15 13:50:46 UTC (rev 626) +++ src/org/fenggui/TextEditor.java 2009-04-15 14:01:06 UTC (rev 627) @@ -303,10 +303,16 @@ return textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); } default: - boolean result =textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); + boolean result = textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); //FIXME: textData should fire an event if its text changes - if (result) - fireTextChangedEvent(null); + if (result) + { + if (e.getKeyClass() == Key.DELETE || e.getKeyClass() == Key.BACKSPACE) + { + fireTextChangedEvent(null); + } + e.setUsed(); + } return result; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-15 14:01:17
|
Revision: 626 http://fenggui.svn.sourceforge.net/fenggui/?rev=626&view=rev Author: marcmenghin Date: 2009-04-15 13:50:46 +0000 (Wed, 15 Apr 2009) Log Message: ----------- - fix textEditor textChanged event not fired on special keys (backspace, delete,..) Modified Paths: -------------- src/org/fenggui/TextEditor.java Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-04-15 10:49:23 UTC (rev 625) +++ src/org/fenggui/TextEditor.java 2009-04-15 13:50:46 UTC (rev 626) @@ -303,7 +303,11 @@ return textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); } default: - return textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); + boolean result =textData.handleKeyPresses(e.getKeyClass(), e.getModifiers(), getAppearance()); + //FIXME: textData should fire an event if its text changes + if (result) + fireTextChangedEvent(null); + return result; } } @@ -445,14 +449,12 @@ passwordData = fittingText; char[] hidingText = new char[fittingText.length()]; Arrays.fill(hidingText, this.passwordHideCharacter); - textData.setContent(new String(hidingText), getAppearance()); + fittingText = new String(hidingText); } - else - { - textData.setContent(fittingText, getAppearance()); - } + + textData.setContent(fittingText, getAppearance()); buildSpecialEvents(); - fireTextChangedEvent(text); + fireTextChangedEvent(fittingText); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-15 10:49:26
|
Revision: 625 http://fenggui.svn.sourceforge.net/fenggui/?rev=625&view=rev Author: marcmenghin Date: 2009-04-15 10:49:23 +0000 (Wed, 15 Apr 2009) Log Message: ----------- - fixed setText() method if its a password field. Modified Paths: -------------- src/org/fenggui/TextEditor.java Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-04-14 10:32:00 UTC (rev 624) +++ src/org/fenggui/TextEditor.java 2009-04-15 10:49:23 UTC (rev 625) @@ -20,6 +20,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Set; import java.util.regex.Pattern; @@ -439,7 +440,17 @@ } } - textData.setContent(fittingText, getAppearance()); + if (isPasswordField()) + { + passwordData = fittingText; + char[] hidingText = new char[fittingText.length()]; + Arrays.fill(hidingText, this.passwordHideCharacter); + textData.setContent(new String(hidingText), getAppearance()); + } + else + { + textData.setContent(fittingText, getAppearance()); + } buildSpecialEvents(); fireTextChangedEvent(text); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-14 10:32:12
|
Revision: 624 http://fenggui.svn.sourceforge.net/fenggui/?rev=624&view=rev Author: marcmenghin Date: 2009-04-14 10:32:00 +0000 (Tue, 14 Apr 2009) Log Message: ----------- - fix line drawing problem in TitleBorder (left and bottom line where not displayed correctly) Modified Paths: -------------- src/org/fenggui/decorator/border/TitledBorder.java Modified: src/org/fenggui/decorator/border/TitledBorder.java =================================================================== --- src/org/fenggui/decorator/border/TitledBorder.java 2009-04-14 07:07:16 UTC (rev 623) +++ src/org/fenggui/decorator/border/TitledBorder.java 2009-04-14 10:32:00 UTC (rev 624) @@ -107,24 +107,24 @@ g.setColor(color); final int OFFSET = 2; - + int halfFontSize = font.getHeight() / 2; + // left g.setLineWidth(1); - g.drawLine(localX, localY, localX, localY + height - font.getHeight() / 2 - OFFSET); + g.drawLine(localX + OFFSET, localY, localX + OFFSET, localY + height - halfFontSize - OFFSET); // right - g.drawLine(localX + width - getRight(), localY, localX + width - getRight(), localY + height - font.getHeight() / 2 + g.drawLine(localX + width - getRight(), localY, localX + width - getRight(), localY + height - halfFontSize - OFFSET + 1); // top - g.drawLine(localX, localY + height - font.getHeight() / 2 - OFFSET, localX + 5, localY + height - font.getHeight() - / 2 - OFFSET); + g.drawLine(localX, localY + height - halfFontSize - OFFSET, localX + 5, localY + height - halfFontSize - OFFSET); - g.drawLine(localX + font.getWidth(title) + 15, localY + height - font.getHeight() / 2 - OFFSET, localX + getLeft() - + width, localY + height - font.getHeight() / 2 - OFFSET); + g.drawLine(localX + font.getWidth(title) + 15, localY + height - halfFontSize - OFFSET, localX + getLeft() + + width, localY + height - halfFontSize - OFFSET); // bottom - g.drawLine(localX, localY, getLeft() + width + getRight(), localY); + g.drawLine(localX, localY + OFFSET, getLeft() + width + getRight(), localY + OFFSET); // set line width back to default g.setLineWidth(1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-14 07:07:19
|
Revision: 623 http://fenggui.svn.sourceforge.net/fenggui/?rev=623&view=rev Author: marcmenghin Date: 2009-04-14 07:07:16 +0000 (Tue, 14 Apr 2009) Log Message: ----------- - replaced a used sun-exception with one from the default java sdk to increase compatibility with other jdks - improved build script Modified Paths: -------------- make/build.xml optional/org/fenggui/TabContainer.java Modified: make/build.xml =================================================================== --- make/build.xml 2009-04-14 06:00:12 UTC (rev 622) +++ make/build.xml 2009-04-14 07:07:16 UTC (rev 623) @@ -7,7 +7,7 @@ </description> <!-- Define base values --> - <property name="version" value="12 Alpha (SVN)" /> + <property name="version" value="ALPHA 12" /> <property name="name" value="FengGUI" /> <property name="websiten" value="http://www.fenggui.org" /> @@ -27,11 +27,11 @@ <property name="jogl1.x" value="./third-party" /> <!-- Define deployment details --> - <property name="deploy.zip" value="./deploy/FengGUI.zip" /> + <property name="deploy.zip" value="FengGUI.zip" /> <property name="deploy.bin.jar" value="FengGUI.jar" /> <property name="deploy.bin-optional.jar" value="FengGUI-Optional.jar" /> <property name="deploy.bin-examples.jar" value="FengGUI-Examples.jar" /> - <property name="deploy.doc.zip" value="./deploy/FengGUI-JavaDoc.zip" /> + <property name="deploy.doc.zip" value="FengGUI-JavaDoc.zip" /> <!-- Define classpath --> <path id="third-party.classpath"> @@ -94,218 +94,218 @@ </target> <target name="makeJavadoc" depends="MakeDirs"> - <javadoc packagenames="org.fenggui.*" sourcepath="${src} ${optional}" defaultexcludes="yes" destdir="${doc}" author="true" version="true" use="true" windowtitle="FengGUI API"> + <javadoc packagenames="org.fenggui.*" defaultexcludes="yes" destdir="${doc}" author="true" version="true" use="true" windowtitle="FengGUI API"> + <packageset dir="${src}" defaultexcludes="yes"></packageset> + <packageset dir="${optional}" defaultexcludes="yes"></packageset> <doctitle> <![CDATA[<h1>FengGUI - Java GUIs with OpenGL</h1>]]></doctitle> - <classpath refid="gen.classpath-optional" /> - <bottom> - <![CDATA[ - <i>Licensed under - <a href="http://www.gnu.org/copyleft/lesser.html">GNU Lesser General Public License</a>. - Please check out the <a href="http://www.fenggui.org">FengGUI website</a> for further information.</i>]]></bottom> - <tag name="todo" scope="all" description="To Do:" /> - <tag name="dedication" scope="all" description="Dedication:" /> -</javadoc> + <classpath refid="gen.classpath-optional" /> + <bottom> + <![CDATA[ + <i>Licensed under + <a href="http://www.gnu.org/copyleft/lesser.html">GNU Lesser General Public License</a>. + Please check out the <a href="http://www.fenggui.org">FengGUI website</a> for further information.</i>]]></bottom> + <tag name="todo" scope="all" description="To Do:" /> + <tag name="dedication" scope="all" description="Dedication:" /> + <!-- add links to java jdk + <link offline="true" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="<localpath>"/> + --> + </javadoc> -<!-- compress JavaDoc and save ZIP file in deploy dir --> -<zip destfile="${deploy}/${deploy.doc.zip}" basedir="${doc}" /> -</target> + <!-- compress JavaDoc and save ZIP file in deploy dir --> + <zip destfile="${deploy}/${deploy.doc.zip}" basedir="${doc}" /> + </target> -<!-- Creates the FengGUI.jar --> -<target name="buildFengGUI.jar" depends="compile"> -<jar destfile="${deploy}/${deploy.bin.jar}" compress="true"> - <fileset dir="${bin}"> - <include name="org/**" /> - </fileset> + <!-- Creates the FengGUI.jar --> + <target name="buildFengGUI.jar" depends="compile"> + <jar destfile="${deploy}/${deploy.bin.jar}" compress="true"> + <fileset dir="${bin}"> + <include name="org/**" /> + </fileset> + + <manifest> + <attribute name="Built-By" value="FengGUI Project" /> + <section name="common"> + <attribute name="Implementation-Title" value="${name}" /> + <attribute name="Implementation-Version" value="${version}" /> + <attribute name="Implementation-URL" value="${websiten}" /> + </section> + </manifest> + </jar> + </target> - <manifest> - <attribute name="Built-By" value="FengGUI Project" /> - <section name="common"> - <attribute name="Implementation-Title" value="${name}" /> - <attribute name="Implementation-Version" value="${version}" /> - <attribute name="Implementation-URL" value="${websiten}" /> - </section> - </manifest> -</jar> -</target> + <!-- Creates the FengGUI-optional.jar --> + <target name="buildFengGUI-optional.jar" depends="compile_optional"> + <jar destfile="${deploy}/${deploy.bin-optional.jar}" compress="true"> + <fileset dir="${bin-optional}"> + <include name="org/**" /> + </fileset> + + <manifest> + <attribute name="Built-By" value="FengGUI Project" /> + <section name="common"> + <attribute name="Implementation-Title" value="${name}" /> + <attribute name="Implementation-Version" value="${version}" /> + <attribute name="Implementation-URL" value="${websiten}" /> + </section> + </manifest> + </jar> + </target> -<!-- Creates the FengGUI-optional.jar --> -<target name="buildFengGUI-optional.jar" depends="compile_optional"> -<jar destfile="${deploy}/${deploy.bin-optional.jar}" compress="true"> - <fileset dir="${bin-optional}"> - <include name="org/**" /> - </fileset> + <!-- Creates the FengGUI-examples.jar --> + <target name="buildFengGUI-examples.jar" depends="compile_examples"> + <jar destfile="${deploy}/${deploy.bin-examples.jar}" compress="true"> + <fileset dir="${bin-examples}"> + <include name="org/fenggui/example/**" /> + </fileset> + + <manifest> + <attribute name="Built-By" value="FengGUI Project" /> + <attribute name="Main-Class" value="org.fenggui.example.ExampleBasisJOGL" /> + <attribute name="Class-Path" value="jogl.jar ${deploy.bin.jar} ${deploy.bin-optional.jar}" /> + <section name="common"> + <attribute name="Implementation-Title" value="${name}" /> + <attribute name="Implementation-Version" value="${version}" /> + <attribute name="Implementation-URL" value="${websiten}" /> + </section> + </manifest> + </jar> + </target> - <manifest> - <attribute name="Built-By" value="FengGUI Project" /> - <section name="common"> - <attribute name="Implementation-Title" value="${name}" /> - <attribute name="Implementation-Version" value="${version}" /> - <attribute name="Implementation-URL" value="${websiten}" /> - </section> - </manifest> -</jar> -</target> + <target name="buildPackage" depends="buildFengGUI.jar, buildFengGUI-optional.jar, buildFengGUI-examples.jar"> -<!-- Creates the FengGUI-examples.jar --> -<target name="buildFengGUI-examples.jar" depends="compile_examples"> -<jar destfile="${deploy}/${deploy.bin-examples.jar}" compress="true"> - <fileset dir="${bin-examples}"> - <include name="org/fenggui/example/**" /> - </fileset> - - <manifest> - <attribute name="Built-By" value="FengGUI Project" /> - <attribute name="Main-Class" value="org.fenggui.example.ExampleBasisJOGL" /> - <attribute name="Class-Path" value="jogl.jar ${deploy.bin.jar} ${deploy.bin-optional.jar}" /> - <section name="common"> - <attribute name="Implementation-Title" value="${name}" /> - <attribute name="Implementation-Version" value="${version}" /> - <attribute name="Implementation-URL" value="${websiten}" /> - </section> - </manifest> -</jar> -</target> - -<target name="buildPackage" depends="buildFengGUI.jar, buildFengGUI-optional.jar, buildFengGUI-examples.jar"> - -<!-- Copy src folder to deployment folder --> -<copy todir="${deploy}/src"> - <fileset dir="${src}" /> -</copy> - -<copy todir="${deploy}/optional"> - <fileset dir="${optional}" /> -</copy> - -<copy todir="${deploy}/test"> - <fileset dir="${examples}" /> -</copy> - -<copyfile dest="${deploy}/" src="./LICENSE"/> - -<!-- Copy 3rd Party JARs to deployment folder --> -<!-- - <copy todir="${deploy}/${third-party}"> - <fileset dir="${third-party}"/> + <!-- Copy src folder to deployment folder --> + <copy todir="${deploy}/src"> + <fileset dir="${src}" /> </copy> - --> -<!-- We do not put JOGL and LWJGL in in ZIP --> -<!-- - <delete file="${deploy}/${third-party}/jogl.jar"/> - <delete file="${deploy}/${third-party}/lwjgl.jar"/> - <delete file="${deploy}/${third-party}/jcore.jar"/> - --> -<!-- Copy data folder to deploy folder --> -<copy todir="${deploy}/${data}"> - <fileset dir="${data}" /> -</copy> - -<!-- zip whole deploy folder to project's base dir --> -<zip destfile="${deploy.zip}"> - <zipfileset dir="${deploy}/data" prefix="data" /> - <zipfileset dir="${deploy}/src" prefix="src" /> - <zipfileset dir="${deploy}/optional" prefix="optional" /> - <zipfileset dir="${deploy}/test" prefix="test" /> - <fileset file="${deploy}/${deploy.bin.jar}" /> - <fileset file="${deploy}/${deploy.bin-optional.jar}" /> - <fileset file="${deploy}/${deploy.bin-examples.jar}" /> - <!-- <zipfileset dir="${deploy}/third-party" prefix="third-party"/> --> -</zip> - -</target> - -<target name="buildWebstart" depends="buildFengGUI.jar, buildFengGUI-examples.jar, buildFengGUI-optional.jar"> - -<copy todir="${webstart}" file="${deploy}/${deploy.bin.jar}" /> -<copy todir="${webstart}" file="${deploy}/${deploy.bin-optional.jar}" /> -<copy todir="${webstart}" file="${deploy}/${deploy.bin-examples.jar}" /> -<!--<copy todir="${webstart}" file="./third-party/jcore.jar" />--> - -<jar destfile="${webstart}/data.jar"> - <zipfileset dir="data" prefix="data" /> -</jar> - -<!-- - I created the key store and a key pair with - - keytool -genkey -keystore FengGUIKeyStore -alias FengGUI + + <copy todir="${deploy}/optional"> + <fileset dir="${optional}" /> + </copy> - password: johannes - --> + <copy todir="${deploy}/test"> + <fileset dir="${examples}" /> + </copy> + + <copy todir="${deploy}" file="./LICENSE"/> + + <!-- Copy 3rd Party JARs to deployment folder --> + <!-- + <copy todir="${deploy}/${third-party}"> + <fileset dir="${third-party}"/> + </copy> + --> + <!-- We do not put JOGL and LWJGL in in ZIP --> + <!-- + <delete file="${deploy}/${third-party}/jogl.jar"/> + <delete file="${deploy}/${third-party}/lwjgl.jar"/> + <delete file="${deploy}/${third-party}/jcore.jar"/> + --> + <!-- Copy data folder to deploy folder --> + <copy todir="${deploy}/${data}"> + <fileset dir="${data}" /> + </copy> + + <!-- zip whole deploy folder to project's base dir --> + <zip destfile="${deploy}/${deploy.zip}"> + <zipfileset dir="${deploy}/data" prefix="data" /> + <zipfileset dir="${deploy}/src" prefix="src" /> + <zipfileset dir="${deploy}/optional" prefix="optional" /> + <zipfileset dir="${deploy}/test" prefix="test" /> + <fileset file="${deploy}/${deploy.bin.jar}" /> + <fileset file="${deploy}/${deploy.bin-optional.jar}" /> + <fileset file="${deploy}/${deploy.bin-examples.jar}" /> + <fileset file="${deploy}/LICENSE" /> + <!-- <zipfileset dir="${deploy}/third-party" prefix="third-party"/> --> + </zip> + </target> -<signjar alias="FengGUI" storepass="johannes" keypass="johannes" keystore="./make/FengGUIKeyStore"> - <fileset dir="${webstart}" casesensitive="yes"> - <filename name="**/*jar" /> - </fileset> -</signjar> + <target name="buildWebstart" depends="buildFengGUI.jar, buildFengGUI-examples.jar, buildFengGUI-optional.jar"> + <copy todir="${webstart}" file="${deploy}/${deploy.bin.jar}" /> + <copy todir="${webstart}" file="${deploy}/${deploy.bin-optional.jar}" /> + <copy todir="${webstart}" file="${deploy}/${deploy.bin-examples.jar}" /> + <!--<copy todir="${webstart}" file="./third-party/jcore.jar" />--> + + <jar destfile="${webstart}/data.jar"> + <zipfileset dir="data" prefix="data" /> + </jar> + + <!-- + I created the key store and a key pair with + + keytool -genkey -keystore FengGUIKeyStore -alias FengGUI + + password: johannes + --> + + <signjar alias="FengGUI" storepass="johannes" keypass="johannes" keystore="./make/FengGUIKeyStore"> + <fileset dir="${webstart}" casesensitive="yes"> + <filename name="**/*jar" /> + </fileset> + </signjar> + </target> -</target> + <target name="deployEverything" depends="buildFengGUI.jar, buildPackage, uploadWebstart, uploadJavaDoc" /> -<target name="deployEverything" depends="buildFengGUI.jar, buildPackage, uploadWebstart, uploadJavaDoc" /> + <target name="uploadWebstart" depends="buildWebstart"> -<target name="uploadWebstart" depends="buildWebstart"> + <property file="passwords.properties" /> + + <sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="rm -rf ~/www/webstart/*" /> + + <scp todir="${myId}:${myPwd}@${myAddress}:~/www/webstart" trust="true"> + + <fileset dir="${webstart}"> + <include name="**" /> + </fileset> + + <fileset file="./www/demo.jnlp" /> + <fileset file="./www/images/fenggui.gif" /> + <fileset file="./www/images/fengguiIcon64x64.gif" /> + </scp> + </target> -<property file="passwords.properties" /> + <target name="uploadSnapshot" depends="buildFengGUI.jar, buildPackage"> + <property file="passwords.properties" /> + <tstamp> + <format property="TODAY" pattern="yyyy-MM-dd" /> + </tstamp> + + <echo message="creating http://user.cs.tu-berlin.de/~schabby/FengGUI/${TODAY}" /> + + <sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="mkdir /home/s/schabby/www/FengGUI/${TODAY}" /> + + <scp todir="${myId}:${myPwd}@${myAddress}:~/www/FengGUI/${TODAY}" trust="true"> + + <fileset file="${deploy}/${deploy.zip}" /> + <fileset file="${deploy}/${deploy.bin.jar}" /> + <fileset file="${deploy}/${deploy.bin-optional.jar}" /> + </scp> + </target> -<sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="rm -rf ~/www/webstart/*" /> + <target name="uploadJavaDoc"> + <property file="passwords.properties" /> + <!-- + <ftp server="${FengGUIAddress}" + remotedir="FengGUI/JavaDoc" + userid="${FengGUIID}" + password="${FengGUIPWD}" + depends="yes" + verbose="yes" + > + <fileset dir="${deploy}/doc/api"/> + </ftp> + --> + + <sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="rm -rf ~/www/FengGUI/JavaDoc/*" /> + + <scp todir="${myId}:${myPwd}@${myAddress}:~/www/FengGUI/JavaDoc" trust="true"> + + <fileset dir="${doc}"> + <include name="**" /> + </fileset> + </scp> + </target> -<scp todir="${myId}:${myPwd}@${myAddress}:~/www/webstart" trust="true"> - - <fileset dir="${webstart}"> - <include name="**" /> - </fileset> - - <fileset file="./www/demo.jnlp" /> - <fileset file="./www/images/fenggui.gif" /> - <fileset file="./www/images/fengguiIcon64x64.gif" /> -</scp> - -</target> - -<target name="uploadSnapshot" depends="buildFengGUI.jar, buildPackage"> -<property file="passwords.properties" /> -<tstamp> - <format property="TODAY" pattern="yyyy-MM-dd" /> -</tstamp> - -<echo message="creating http://user.cs.tu-berlin.de/~schabby/FengGUI/${TODAY}" /> - -<sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="mkdir /home/s/schabby/www/FengGUI/${TODAY}" /> - -<scp todir="${myId}:${myPwd}@${myAddress}:~/www/FengGUI/${TODAY}" trust="true"> - - <fileset file="${deploy}/FengGUI.zip" /> - <fileset file="${deploy}/FengGUI.jar" /> -</scp> - -</target> - -<target name="uploadJavaDoc"> - -<property file="passwords.properties" /> -<!-- - <ftp server="${FengGUIAddress}" - remotedir="FengGUI/JavaDoc" - userid="${FengGUIID}" - password="${FengGUIPWD}" - depends="yes" - verbose="yes" - > - <fileset dir="${deploy}/doc/api"/> - </ftp> - --> - -<sshexec host="${myAddress}" trust="true" username="${myId}" password="${myPwd}" command="rm -rf ~/www/FengGUI/JavaDoc/*" /> - -<scp todir="${myId}:${myPwd}@${myAddress}:~/www/FengGUI/JavaDoc" trust="true"> - - <fileset dir="${doc}"> - <include name="**" /> - </fileset> -</scp> - -</target> - </project> Modified: optional/org/fenggui/TabContainer.java =================================================================== --- optional/org/fenggui/TabContainer.java 2009-04-14 06:00:12 UTC (rev 622) +++ optional/org/fenggui/TabContainer.java 2009-04-14 07:07:16 UTC (rev 623) @@ -31,8 +31,6 @@ import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Dimension; -import sun.reflect.generics.reflectiveObjects.NotImplementedException; - /** * Implementation of a tab container. * @@ -372,27 +370,27 @@ public IWidget getWidget(int index) { - throw new NotImplementedException(); + throw new UnsupportedOperationException(); } public Iterable<IWidget> getWidgets() { - throw new NotImplementedException(); + throw new UnsupportedOperationException(); } public void removeAllWidgets() { - throw new NotImplementedException(); + throw new UnsupportedOperationException(); } public void removeWidget(IWidget... c) { - throw new NotImplementedException(); + throw new UnsupportedOperationException(); } public List<IWidget> getContent() { - throw new NotImplementedException(); + throw new UnsupportedOperationException(); } public boolean isKeyTraversalRoot() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-14 06:00:15
|
Revision: 622 http://fenggui.svn.sourceforge.net/fenggui/?rev=622&view=rev Author: marcmenghin Date: 2009-04-14 06:00:12 +0000 (Tue, 14 Apr 2009) Log Message: ----------- - fixed missing setFocused(false) implementation Modified Paths: -------------- src/org/fenggui/StatefullWidget.java Modified: src/org/fenggui/StatefullWidget.java =================================================================== --- src/org/fenggui/StatefullWidget.java 2009-04-13 12:46:43 UTC (rev 621) +++ src/org/fenggui/StatefullWidget.java 2009-04-14 06:00:12 UTC (rev 622) @@ -65,7 +65,7 @@ public StatefullWidget(StatefullWidget<T> widget) { super(widget); - + this.hovered = widget.hovered; this.error = widget.error; this.defaultHoverCursorType = widget.defaultHoverCursorType; @@ -203,8 +203,19 @@ */ public void setFocused(boolean focused) { - if (this.getDisplay() != null && focused) - this.getDisplay().setFocusedWidget(this); + if (this.getDisplay() != null) + { + if (focused) + { + this.getDisplay().setFocusedWidget(this); + } + else + { + if (isFocused()) + this.getDisplay().setFocusedWidget(null); + } + } + updateState(); } @@ -292,7 +303,7 @@ public StatefullWidget<T> clone() { StatefullWidget<T> result = (StatefullWidget<T>) super.clone(); - + return result; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-13 12:46:51
|
Revision: 621 http://fenggui.svn.sourceforge.net/fenggui/?rev=621&view=rev Author: marcmenghin Date: 2009-04-13 12:46:43 +0000 (Mon, 13 Apr 2009) Log Message: ----------- - fixed problems with TextEditor widgets addAtBeginning(..) and addAtEnd(..) Modified Paths: -------------- src/org/fenggui/text/content/ContentLine.java src/org/fenggui/text/content/ContentManager.java src/org/fenggui/text/content/ContentUserLine.java test/org/fenggui/example/TextAreaExample.java test/org/fenggui/unit/ContentTestBase.java Modified: src/org/fenggui/text/content/ContentLine.java =================================================================== --- src/org/fenggui/text/content/ContentLine.java 2009-04-12 12:14:22 UTC (rev 620) +++ src/org/fenggui/text/content/ContentLine.java 2009-04-13 12:46:43 UTC (rev 621) @@ -1048,34 +1048,6 @@ } } - // public int getContentIndexOfAtom(int atom) - // { - // int index = 0; - // int currentAtom = 0; - // AbstractContentPart currentPart = null; - // - // for (AbstractContentPart part : content) - // { - // index += part.getIndexCount(); - // currentAtom += part.getAtomCount(); - // currentPart = part; - // if (currentAtom > atom) - // { - // break; - // } - // } - // - // if (currentPart != null) - // { - // currentAtom -= currentPart.getAtomCount(); - // int preIndex = atom - currentAtom; - // index -= currentPart.getIndexCount(); - // if (preIndex != 0) index += currentPart.getBeforeLength() + preIndex; - // if (preIndex == currentPart.getAtomCount()) index += currentPart.getAfterLength(); - // } - // return index; - // } - /* (non-Javadoc) * @see org.fenggui.text.content.IContent#addContentAtBegining(java.lang.Object,int, org.fenggui.text.content.IContentFactory) */ @@ -1083,8 +1055,12 @@ TextAppearance appearance) { List<AbstractContentPart> parts = factory.getContentParts(content, appearance); - for (AbstractContentPart part : parts) + for (int i = parts.size() - 1; i >= 0; i--) + { + AbstractContentPart part = parts.get(i); this.addAtBeginning(part, appearance); + } + return true; } Modified: src/org/fenggui/text/content/ContentManager.java =================================================================== --- src/org/fenggui/text/content/ContentManager.java 2009-04-12 12:14:22 UTC (rev 620) +++ src/org/fenggui/text/content/ContentManager.java 2009-04-13 12:46:43 UTC (rev 621) @@ -421,9 +421,8 @@ { if (this.content.size() >= 1) { - ContentUserLine line = this.content.remove(this.content.size() - 1); + this.content.remove(this.content.size() - 1); update(); - // this.atomCountCache -= line.getAtomCount(); } } } @@ -434,9 +433,8 @@ { if (this.content.size() >= 1) { - ContentUserLine line = this.content.remove(0); + this.content.remove(0); update(); - // this.atomCountCache -= line.getAtomCount(); } } } @@ -967,13 +965,19 @@ synchronized (this.content) { Object[] lines = factory.getContentLines(content); - for (Object line : lines) + + //merge with first line + this.content.get(0).addContentAtBegining(lines[lines.length - 1], this.requestedWidthCache, this.autoWarp, + factory, appearance); + + for (int i = lines.length - 2; i >= 0; i--) { - boolean result = this.content.get(0).addContentAtBegining(line, this.requestedWidthCache, this.autoWarp, - factory, appearance); - if (!result) - return false; + Object line = lines[i]; + List<AbstractContentPart> parts = this.factory.getContentParts(line, appearance); + ContentLine cLine = new ContentLine(parts); + this.content.add(0, new ContentUserLine(cLine)); } + this.update(); return true; } @@ -984,13 +988,19 @@ synchronized (this.content) { Object[] lines = factory.getContentLines(content); - for (Object line : lines) + + //merge first with last line + this.content.get(this.content.size() - 1).addContentAtEnd(lines[0], this.requestedWidthCache, this.autoWarp, + factory, appearance); + + for (int i = 1; i < lines.length; i++) { - boolean result = this.content.get(this.content.size() - 1).addContentAtEnd(line, this.requestedWidthCache, - this.autoWarp, factory, appearance); - if (!result) - return false; + Object line = lines[i]; + List<AbstractContentPart> parts = this.factory.getContentParts(line, appearance); + ContentLine cLine = new ContentLine(parts); + this.content.add(this.content.size(), new ContentUserLine(cLine)); } + this.update(); return true; } Modified: src/org/fenggui/text/content/ContentUserLine.java =================================================================== --- src/org/fenggui/text/content/ContentUserLine.java 2009-04-12 12:14:22 UTC (rev 620) +++ src/org/fenggui/text/content/ContentUserLine.java 2009-04-13 12:46:43 UTC (rev 621) @@ -55,9 +55,12 @@ updateSize(); } - public ContentUserLine(ArrayList<ContentLine> lines) + public ContentUserLine(ContentLine... lines) { - content = lines; + content = new ArrayList<ContentLine>(lines.length); + for (ContentLine line : lines) + content.add(line); + updateSize(); } @@ -824,17 +827,20 @@ public boolean addContentAtEnd(Object content, int width, boolean wordwarp, IContentFactory factory, TextAppearance appearance) { - boolean result = this.content.get(0).addContentAtEnd(content, width, wordwarp, factory, appearance); + boolean result = this.content.get(this.content.size() - 1).addContentAtEnd(content, width, wordwarp, factory, + appearance); this.UpdateContent(width, wordwarp, factory, appearance); return result; } - + public boolean isValidCharacter(char character, TextAppearance appearance) { if (this.activeLine != null) { return this.activeLine.isValidCharacter(character, appearance); - } else { + } + else + { return false; } } Modified: test/org/fenggui/example/TextAreaExample.java =================================================================== --- test/org/fenggui/example/TextAreaExample.java 2009-04-12 12:14:22 UTC (rev 620) +++ test/org/fenggui/example/TextAreaExample.java 2009-04-13 12:46:43 UTC (rev 621) @@ -83,10 +83,10 @@ filesFrame.setY(50); filesFrame.setSize(300, 200); - filesFrame.getContentContainer().setLayoutManager(new BorderLayout()); + filesFrame.getContentContainer().setLayoutManager(new RowExLayout(false)); ScrollContainer sc = FengGUI.createScrollContainer(filesFrame.getContentContainer()); - sc.setLayoutData(BorderLayoutData.CENTER); + sc.setLayoutData(new RowExLayoutData(true, true)); final TextEditor textArea = FengGUI.createTextEditor(sc); // final String text = ""; @@ -118,7 +118,7 @@ Container container = FengGUI.createContainer(filesFrame.getContentContainer()); container.setLayoutManager(new RowExLayout(true)); - container.setLayoutData(BorderLayoutData.SOUTH); + container.setLayoutData(new RowExLayoutData(true, false)); final CheckBox<Integer> multilineCheckBox = FengGUI.<Integer> createCheckBox(container, "Multiline"); multilineCheckBox.setSelected(false); @@ -165,8 +165,14 @@ }); - Button btn = FengGUI.createButton(container); + Container container2 = FengGUI.createContainer(filesFrame.getContentContainer()); + container2.setLayoutManager(new RowExLayout(true)); + container2.setLayoutData(new RowExLayoutData(true, false)); + + + Button btn = FengGUI.createWidget(Button.class); btn.setText("reset text"); + btn.setLayoutData(new RowExLayoutData(true, true)); btn.addButtonPressedListener(new IButtonPressedListener() { @@ -176,6 +182,36 @@ } }); + + Button btn2 = FengGUI.createWidget(Button.class); + btn2.setText("add to end"); + btn2.setLayoutData(new RowExLayoutData(true, true)); + btn2.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + textArea.addContentAtEnd("New Text At end\neven with a second line here"); + } + + }); + + Button btn3 = FengGUI.createWidget(Button.class); + btn3.setText("add to beginning"); + btn3.setLayoutData(new RowExLayoutData(true, true)); + btn3.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + textArea.addContentAtBeginning("New Text At beginning\neven with a second line here"); + } + + }); + + container2.addWidget(btn, btn2, btn3); + + filesFrame.layout(); } Modified: test/org/fenggui/unit/ContentTestBase.java =================================================================== --- test/org/fenggui/unit/ContentTestBase.java 2009-04-12 12:14:22 UTC (rev 620) +++ test/org/fenggui/unit/ContentTestBase.java 2009-04-13 12:46:43 UTC (rev 621) @@ -47,11 +47,11 @@ public ContentUserLine getUserLine(String[] texts) { - ArrayList<ContentLine> lines = new ArrayList<ContentLine>(texts.length); + ContentLine[] lines = new ContentLine[texts.length]; - for (String text : texts) + for (int i = 0; i < texts.length; i++) { - lines.add(getLine(text)); + lines[i] = getLine(texts[i]); } ContentUserLine result = new ContentUserLine(lines); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-12 12:14:24
|
Revision: 620 http://fenggui.svn.sourceforge.net/fenggui/?rev=620&view=rev Author: marcmenghin Date: 2009-04-12 12:14:22 +0000 (Sun, 12 Apr 2009) Log Message: ----------- - fix problem with scrollbar not draggable anymore - removed JOGL FengGUI character background renderer for release - set QtCurve as startup theme for examples Modified Paths: -------------- src/org/fenggui/Slider.java test/org/fenggui/example/Everything.java test/org/fenggui/example/ExampleBasisJOGL.java Modified: src/org/fenggui/Slider.java =================================================================== --- src/org/fenggui/Slider.java 2009-04-12 11:51:05 UTC (rev 619) +++ src/org/fenggui/Slider.java 2009-04-12 12:14:22 UTC (rev 620) @@ -192,35 +192,7 @@ super.activated(activationEvent); } - /* @Override - public void setValidHeight(int height) - { - if(horizontal) - { - setHeight(getMinHeight()); - } - else - { - super.setValidHeight(height); - } - } - - @Override - public void setValidWidth(int width) - { - if(horizontal) - { - super.setValidWidth(width); - } - else - { - setWidth(getMinWidth()); - } - } - */ - - @Override public IWidget getWidget(int x, int y) { if (!getAppearance().insideMargin(x, y)) @@ -249,13 +221,13 @@ public void select(int x, int y, Set<Key> modifiers) { - cacheDisplayX = getDisplayX(); - cacheDisplayY = getDisplayY(); + cacheDisplayX = this.sliderButton.getDisplayX(); + cacheDisplayY = this.sliderButton.getDisplayY(); x -= cacheDisplayX; y -= cacheDisplayY; //pressed = hitsHorizontalSlider(x, y); - deltaX = getSliderStart() - x; - deltaY = getSliderStart() - y; + deltaX = this.sliderButton.getSliderStart() - x; + deltaY = this.sliderButton.getSliderStart() - y; } public void drag(int x, int y, Set<Key> modifiers) @@ -267,9 +239,9 @@ x += deltaX; - setValue((double) x / (double) (getWidth() - this.sliderButton.getWidth())); + this.sliderButton.setValue((double) x / (double) (this.sliderButton.getWidth() - this.sliderButton.sliderButton.getWidth())); - fireSliderMovedEvent(); + this.sliderButton.fireSliderMovedEvent(); } else @@ -279,9 +251,9 @@ y += deltaY; - setValue((double) y / (double) (getHeight() - this.sliderButton.getHeight())); + this.sliderButton.setValue((double) y / (double) (this.sliderButton.getHeight() - this.sliderButton.sliderButton.getHeight())); - fireSliderMovedEvent(); + this.sliderButton.fireSliderMovedEvent(); } } @@ -293,7 +265,7 @@ public boolean isDndWidget(IWidget w, int x, int y) { - return w.equals(this.sliderButton); + return w.equals(this.sliderButton.sliderButton); } } Modified: test/org/fenggui/example/Everything.java =================================================================== --- test/org/fenggui/example/Everything.java 2009-04-12 11:51:05 UTC (rev 619) +++ test/org/fenggui/example/Everything.java 2009-04-12 12:14:22 UTC (rev 620) @@ -539,7 +539,7 @@ { display = g; - //loadThemeDirect("data/themes/QtCurve/QtCurve.xml"); + loadThemeDirect("data/themes/QtCurve/QtCurve.xml", false); buildMenuBar(); Modified: test/org/fenggui/example/ExampleBasisJOGL.java =================================================================== --- test/org/fenggui/example/ExampleBasisJOGL.java 2009-04-12 11:51:05 UTC (rev 619) +++ test/org/fenggui/example/ExampleBasisJOGL.java 2009-04-12 12:14:22 UTC (rev 620) @@ -112,7 +112,7 @@ gl.glLoadIdentity(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - render3DBackgroundFengGUISign(); + //render3DBackgroundFengGUISign(); display.display(); screenshotActor.renderToDos(display.getBinding().getOpenGL(), display.getWidth(), display.getHeight()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-12 11:51:06
|
Revision: 619 http://fenggui.svn.sourceforge.net/fenggui/?rev=619&view=rev Author: marcmenghin Date: 2009-04-12 11:51:05 +0000 (Sun, 12 Apr 2009) Log Message: ----------- - fix texteditor problem with wrong active part on enter key presses - fix texteditor input character validation for enter and tab key - removed a few unused event overrides from the texteditor Modified Paths: -------------- src/org/fenggui/TextEditor.java src/org/fenggui/text/content/ContentLine.java src/org/fenggui/text/content/ContentManager.java Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-04-09 09:29:13 UTC (rev 618) +++ src/org/fenggui/TextEditor.java 2009-04-12 11:51:05 UTC (rev 619) @@ -39,17 +39,13 @@ import org.fenggui.event.key.KeyPressedEvent; import org.fenggui.event.key.KeyTypedEvent; import org.fenggui.event.mouse.MouseButton; -import org.fenggui.event.mouse.MouseClickedEvent; import org.fenggui.event.mouse.MouseDoubleClickedEvent; -import org.fenggui.event.mouse.MouseDraggedEvent; import org.fenggui.event.mouse.MouseEnteredEvent; import org.fenggui.event.mouse.MouseExitedEvent; -import org.fenggui.event.mouse.MousePressedEvent; -import org.fenggui.event.mouse.MouseReleasedEvent; import org.fenggui.text.EditableTextContentManager; import org.fenggui.text.IEditableTextContentManager; -import org.fenggui.text.TextContentManager; import org.fenggui.text.ITextContentManager; +import org.fenggui.text.TextContentManager; import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Dimension; @@ -207,46 +203,6 @@ } /* (non-Javadoc) - * @see org.fenggui.ObservableWidget#mouseClicked(org.fenggui.event.mouse.MouseClickedEvent) - */ - @Override - public void mouseClicked(MouseClickedEvent event) - { - // textData.clickedOn(event.getLocalX(this), event.getLocalY(this), event.getModifiers(), getAppearance()); - super.mouseClicked(event); - } - - /* (non-Javadoc) - * @see org.fenggui.ObservableWidget#mouseDragged(org.fenggui.event.mouse.MouseDraggedEvent) - */ - @Override - public void mouseDragged(MouseDraggedEvent event) - { - // textData.dragedTo(event.getLocalX(this), event.getLocalY(this), event.getModifiers(), getAppearance()); - super.mouseDragged(event); - } - - /* (non-Javadoc) - * @see org.fenggui.ObservableWidget#mousePressed(org.fenggui.event.mouse.MousePressedEvent) - */ - @Override - public void mousePressed(MousePressedEvent mousePressedEvent) - { - // TODO Auto-generated method stub - super.mousePressed(mousePressedEvent); - } - - /* (non-Javadoc) - * @see org.fenggui.ObservableWidget#mouseReleased(org.fenggui.event.mouse.MouseReleasedEvent) - */ - @Override - public void mouseReleased(MouseReleasedEvent mouseReleasedEvent) - { - // TODO Auto-generated method stub - super.mouseReleased(mouseReleasedEvent); - } - - /* (non-Javadoc) * @see org.fenggui.ObservableWidget#mouseEntered(org.fenggui.event.mouse.MouseEnteredEvent) */ @Override Modified: src/org/fenggui/text/content/ContentLine.java =================================================================== --- src/org/fenggui/text/content/ContentLine.java 2009-04-09 09:29:13 UTC (rev 618) +++ src/org/fenggui/text/content/ContentLine.java 2009-04-12 11:51:05 UTC (rev 619) @@ -105,7 +105,7 @@ AbstractContentPart rest = this.activePart.splitAtChar(this.activePart.getActivePosition(appearance), appearance); if (rest != null) - result.addAtEnd(rest, appearance); + rest = result.addAtEnd(rest, appearance); // add all other lines boolean found = false; @@ -157,7 +157,7 @@ return result; } - private void addAtEnd(AbstractContentPart part, TextAppearance appearance) + private AbstractContentPart addAtEnd(AbstractContentPart part, TextAppearance appearance) { size.setHeight(Math.max(size.getHeight(), part.getSize().getHeight())); size.setWidth(size.getWidth() + part.getSize().getWidth()); @@ -177,6 +177,8 @@ { content.add(content.size(), part); } + + return content.get(content.size() - 1); } private void addAtBeginning(AbstractContentPart part, TextAppearance appearance) @@ -1103,7 +1105,9 @@ if (this.activePart != null) { return this.activePart.isValidCharacter(character, appearance); - } else { + } + else + { return false; } } Modified: src/org/fenggui/text/content/ContentManager.java =================================================================== --- src/org/fenggui/text/content/ContentManager.java 2009-04-09 09:29:13 UTC (rev 618) +++ src/org/fenggui/text/content/ContentManager.java 2009-04-12 11:51:05 UTC (rev 619) @@ -1000,6 +1000,10 @@ { if (activeLine != null) { + if (character == '\t' || (character == '\n' && multiline)) + { + return true; + } return activeLine.isValidCharacter(character, appearance); } else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-09 09:29:24
|
Revision: 618 http://fenggui.svn.sourceforge.net/fenggui/?rev=618&view=rev Author: marcmenghin Date: 2009-04-09 09:29:13 +0000 (Thu, 09 Apr 2009) Log Message: ----------- - added selection definition to QtCurve TextEditor widget definition Modified Paths: -------------- data/themes/QtCurve/QtCurve.xml Modified: data/themes/QtCurve/QtCurve.xml =================================================================== --- data/themes/QtCurve/QtCurve.xml 2009-04-07 18:31:55 UTC (rev 617) +++ data/themes/QtCurve/QtCurve.xml 2009-04-09 09:29:13 UTC (rev 618) @@ -811,8 +811,14 @@ <!-- define text styles --> <TextStyle key="default"> <Style key="default" fontstyle="default"> - <Color ref="textColor" /> - </Style> + <Color ref="textColor" /> + <SelectionColor rgba="255, 255, 255, 255"/> + <SelectionBackground> + <PlainBackground> + <Color rgba="155, 155, 255, 130"/> + </PlainBackground> + </SelectionBackground> + </Style> </TextStyle> <!-- define the cursor to use --> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-07 18:31:58
|
Revision: 617 http://fenggui.svn.sourceforge.net/fenggui/?rev=617&view=rev Author: marcmenghin Date: 2009-04-07 18:31:55 +0000 (Tue, 07 Apr 2009) Log Message: ----------- - fixed path in runexamples.sh - improved QtCurve Tree definition - fixed NPE in TreeItem if no icons are defined in theme - fixed NPE in StandardWidget - fixed cloning of Slider and ScrollBar - disabled non-working examples in Everything class (will not be fixed for release) Modified Paths: -------------- data/themes/QtCurve/QtCurve.xml optional/org/fenggui/composite/tree/TreeItem.java runexamples.sh src/org/fenggui/ScrollBar.java src/org/fenggui/Slider.java src/org/fenggui/StandardWidget.java test/org/fenggui/example/Everything.java Modified: data/themes/QtCurve/QtCurve.xml =================================================================== --- data/themes/QtCurve/QtCurve.xml 2009-04-07 12:02:56 UTC (rev 616) +++ data/themes/QtCurve/QtCurve.xml 2009-04-07 18:31:55 UTC (rev 617) @@ -976,7 +976,19 @@ <PlainBackground> <Color rgba="255, 255, 255, 255"/> </PlainBackground> - </BackgroundDecorators> + </BackgroundDecorators> + + <SelectionUnderlay> + <PlainBackground> + <Color rgba="155, 155, 255, 130"/> + </PlainBackground> + </SelectionUnderlay> + + <HoverUnderlay> + <PlainBackground> + <Color rgba="255, 200, 150, 100"/> + </PlainBackground> + </HoverUnderlay> </Appearance> </Tree> Modified: optional/org/fenggui/composite/tree/TreeItem.java =================================================================== --- optional/org/fenggui/composite/tree/TreeItem.java 2009-04-07 12:02:56 UTC (rev 616) +++ optional/org/fenggui/composite/tree/TreeItem.java 2009-04-07 18:31:55 UTC (rev 617) @@ -243,7 +243,8 @@ { icon = appearance.getPixmap(PLUSICONKEY); } - offsetX = icon.getWidth() + 2; + if (icon != null) + offsetX = icon.getWidth() + 2; size.setWidth(size.getWidth() + offsetX); @@ -285,13 +286,18 @@ { icon = appearance.getPixmap(PLUSICONKEY); } - - g.setColor(Color.WHITE); - g.drawImage(icon, x, y - (Alignment.MIDDLE.alignY(contentSize.getHeight(), icon.getHeight()) + icon.getHeight())); - offsetX = icon.getWidth() + 2; + if (icon != null) + { + g.setColor(Color.WHITE); + g.drawImage(icon, x, y + - (Alignment.MIDDLE.alignY(contentSize.getHeight(), icon.getHeight()) + icon.getHeight())); + offsetX = icon.getWidth() + 2; + } } - super.render(x + offsetX, y - contentSize.getHeight(), width, contentSize.getHeight(), hoveredItem, appearance, g); + g.setColor(appearance.getColor()); + super.render(x + offsetX, y - contentSize.getHeight(), width - offsetX, contentSize.getHeight(), hoveredItem, + appearance, g); //draw childs if (this.hasChilds() && this.expanded) Modified: runexamples.sh =================================================================== --- runexamples.sh 2009-04-07 12:02:56 UTC (rev 616) +++ runexamples.sh 2009-04-07 18:31:55 UTC (rev 617) @@ -8,7 +8,7 @@ builddir=$dir/classes workspace=$dir/.. jogl=$workspace/jogl - lwjgl=$workspace/lwjgl-1.0beta3/native/linux/ + lwjgl=$workspace/lwjgl-1.1.4/native/linux/ # gluegen=$workspace/gluegen Modified: src/org/fenggui/ScrollBar.java =================================================================== --- src/org/fenggui/ScrollBar.java 2009-04-07 12:02:56 UTC (rev 616) +++ src/org/fenggui/ScrollBar.java 2009-04-07 18:31:55 UTC (rev 617) @@ -368,6 +368,7 @@ increaseBtn.paint(g); g.translate(-increaseBtn.getX(), -increaseBtn.getY()); + //if button is pressed move slider slowly if (increaseBtn.isPressed() && autoScrollDelay.getState() == 1) { slider.setValue(slider.getValue() + buttonJump / 10.0); @@ -393,10 +394,12 @@ { ScrollBar result = (ScrollBar) super.clone(); + result.appearance = this.appearance.clone(result); + + result.autoScrollDelay = new Timer(2, 500); result.slider = this.slider.clone(); result.increaseBtn = this.increaseBtn.clone(); result.decreaseBtn = this.decreaseBtn.clone(); - result.appearance = this.appearance.clone(result); result.setupElements(); Modified: src/org/fenggui/Slider.java =================================================================== --- src/org/fenggui/Slider.java 2009-04-07 12:02:56 UTC (rev 616) +++ src/org/fenggui/Slider.java 2009-04-07 18:31:55 UTC (rev 617) @@ -72,7 +72,7 @@ private double clickJump = 0.03; - private IDragAndDropListener dndListener = new SliderDnDListener(); + private IDragAndDropListener dndListener = new SliderDnDListener(this); /** * Creates a new Slider object. @@ -240,7 +240,13 @@ private int deltaY = 0; private int cacheDisplayX = -1; // only for peformance reasons private int cacheDisplayY = -1; - + private Slider sliderButton; + + public SliderDnDListener(Slider slider) + { + this.sliderButton = slider; + } + public void select(int x, int y, Set<Key> modifiers) { cacheDisplayX = getDisplayX(); @@ -261,7 +267,7 @@ x += deltaX; - setValue((double) x / (double) (getWidth() - sliderButton.getWidth())); + setValue((double) x / (double) (getWidth() - this.sliderButton.getWidth())); fireSliderMovedEvent(); @@ -273,7 +279,7 @@ y += deltaY; - setValue((double) y / (double) (getHeight() - sliderButton.getHeight())); + setValue((double) y / (double) (getHeight() - this.sliderButton.getHeight())); fireSliderMovedEvent(); @@ -287,7 +293,7 @@ public boolean isDndWidget(IWidget w, int x, int y) { - return w.equals(sliderButton); + return w.equals(this.sliderButton); } } @@ -560,6 +566,10 @@ result.sliderButton = this.sliderButton.clone(); result.sliderButton.setParent(result); + result.dndListener = new SliderDnDListener(result); + result.sliderMoved = new SliderMovedEvent(result); + result.sliderMovedHook = new ArrayList<ISliderMovedListener>(); + result.setAppearance(this.getAppearance().clone(result)); return result; Modified: src/org/fenggui/StandardWidget.java =================================================================== --- src/org/fenggui/StandardWidget.java 2009-04-07 12:02:56 UTC (rev 616) +++ src/org/fenggui/StandardWidget.java 2009-04-07 18:31:55 UTC (rev 617) @@ -185,7 +185,10 @@ protected final void setupTheme(Class<?> clazz) { if (this.getClass().equals(clazz)) - FengGUI.getTheme().setUp(this); + { + if (FengGUI.getTheme() != null) + FengGUI.getTheme().setUp(this); + } } /* (non-Javadoc) Modified: test/org/fenggui/example/Everything.java =================================================================== --- test/org/fenggui/example/Everything.java 2009-04-07 12:02:56 UTC (rev 616) +++ test/org/fenggui/example/Everything.java 2009-04-07 18:31:55 UTC (rev 617) @@ -119,7 +119,7 @@ registerExample(new TextAreaExample(), textMenu, true); registerExample(new TextViewExample(), textMenu, true); registerExample(new MultiLineLabelExample(), textMenu, true); - registerExample(new LabelExample(), textMenu, true); + //registerExample(new LabelExample(), textMenu, true); registerExample(new FontExample(), textMenu, true); } @@ -156,7 +156,7 @@ registerExample(new ClippingExample(), miscMenu, true); registerExample(new CursorExample(), miscMenu, true); - registerExample(new SnappingSliderExample(), miscMenu, true); + // registerExample(new SnappingSliderExample(), miscMenu, true); Menu submen1Menu = FengGUI.createMenu(miscMenu, "Submenus", false); submen1Menu.addItem(new MenuItem("Submenu Item 1", false, menuBar.getAppearance())); @@ -172,8 +172,8 @@ registerExample(new ConnectionWindowExample(), miscMenu, true); registerExample(new FPSLabelExample(), miscMenu, true); - registerExample(new TextRendererExample(), miscMenu, true); - registerExample(new ConsoleExample(), miscMenu, true); + //registerExample(new TextRendererExample(), miscMenu, true); + //registerExample(new ConsoleExample(), miscMenu, true); registerExample(new SVGExample(), miscMenu, true); registerExample(new PixmapDecoratorExample(), miscMenu, true); registerExample(new PopupMenuExample(), miscMenu, true); @@ -189,10 +189,10 @@ registerExample(new PixmapBorderExample(), decoratorMenu, true); registerExample(new GameMenuExample(), miscMenu, true); - registerExample(new ChatExample(), miscMenu, true); + //registerExample(new ChatExample(), miscMenu, true); MenuItem guiInspectorItem = new MenuItem("GUI Inspector", menuBar.getAppearance()); - miscMenu.addItem(guiInspectorItem); +// miscMenu.addItem(guiInspectorItem); guiInspectorItem.addMenuItemPressedListener(new IMenuItemPressedListener() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-04-07 12:03:05
|
Revision: 616 http://fenggui.svn.sourceforge.net/fenggui/?rev=616&view=rev Author: marcmenghin Date: 2009-04-07 12:02:56 +0000 (Tue, 07 Apr 2009) Log Message: ----------- - improved documentation on various widgets Modified Paths: -------------- src/org/fenggui/ModelWidget.java src/org/fenggui/ObservableLabelWidget.java src/org/fenggui/ObservableWidget.java src/org/fenggui/StandardWidget.java src/org/fenggui/StatefullWidget.java src/org/fenggui/Widget.java Modified: src/org/fenggui/ModelWidget.java =================================================================== --- src/org/fenggui/ModelWidget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/ModelWidget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -40,13 +40,15 @@ protected abstract void ModelUpdated(M model, boolean newModel); /** - * + * creates a new ModelWidget */ public ModelWidget() { } /** + * copy constructor. + * * @param widget */ public ModelWidget(ModelWidget<T, M> widget) Modified: src/org/fenggui/ObservableLabelWidget.java =================================================================== --- src/org/fenggui/ObservableLabelWidget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/ObservableLabelWidget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -50,6 +50,9 @@ private ISizeChangedListener sizeChangedListener; + /** + * Creates a new ObservalbeWidget + */ public ObservableLabelWidget() { super(); @@ -126,11 +129,17 @@ textData.setContent(text, getAppearance()); } + /* (non-Javadoc) + * @see org.fenggui.IPixmapWidget#getPixmap() + */ public Pixmap getPixmap() { return pixmap; } + /* (non-Javadoc) + * @see org.fenggui.IPixmapWidget#setPixmap(org.fenggui.binding.render.Pixmap) + */ public void setPixmap(Pixmap pixmap) { this.pixmap = pixmap; @@ -148,6 +157,9 @@ super.sizeChanged(event); } + /* (non-Javadoc) + * @see org.fenggui.StandardWidget#process(org.fenggui.theme.xml.InputOutputStream) + */ @Override public void process(InputOutputStream stream) throws IOException, IXMLStreamableException { @@ -161,6 +173,9 @@ } } + /* (non-Javadoc) + * @see org.fenggui.StandardWidget#getMinContentSize() + */ @Override public Dimension getMinContentSize() { @@ -190,6 +205,9 @@ return new Dimension(width, height); } + /* (non-Javadoc) + * @see org.fenggui.StandardWidget#paintContent(org.fenggui.binding.render.Graphics, org.fenggui.binding.render.IOpenGL) + */ @Override public void paintContent(Graphics g, IOpenGL gl) { @@ -273,6 +291,9 @@ textData.setWordWarping(warp, getAppearance()); } + /** + * @return + */ public ITextContentManager getTextRendererData() { return textData; Modified: src/org/fenggui/ObservableWidget.java =================================================================== --- src/org/fenggui/ObservableWidget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/ObservableWidget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -31,7 +31,6 @@ import org.fenggui.event.key.IKeyReleasedListener; import org.fenggui.event.key.IKeyTypedListener; import org.fenggui.event.key.Key; -import org.fenggui.event.key.KeyAdapter; import org.fenggui.event.key.KeyPressedEvent; import org.fenggui.event.key.KeyReleasedEvent; import org.fenggui.event.key.KeyTypedEvent; @@ -54,112 +53,92 @@ import org.fenggui.event.mouse.MouseWheelEvent; /** - * Widget that travels between states. - * <p/> - * Every Widget can be disabled and enabled. Thus, StateWidget dictates its subclasses to - * implement <code>getDefaultState</code> and <code>getDisabledtState</code>. The - * default state is regardes as the 'enabled' state.<br/> <br/> As a convention, - * subclasses of <code>StateWidget</code> should contain at least the methods - * <code>getDefaultAppearnace</code> and <code>getDisabledAppearance</code>. Both - * appearances can then be access through the theme loader by 'defaultAppearance' and - * 'disbledAppearance'. - * <p/> - * TODO Does a container really have to a StateWidget? Only for enabling/disabling? - * + * This widget adds various listener methods to all subclasses. It enriches the widgets + * with common events. + * * @author Johannes Schaback, last edited by $Author$, $Date: 2007-11-29 * 18:32:35 +0100 (Do, 29 Nov 2007) $ * @version $Revision$ - * @todo Comment this class... # */ public abstract class ObservableWidget extends StandardWidget { private boolean enabled = true; - private IKeyListener keyTraversalListener = null; + private boolean traversable = false; private IWidget nextWidget = null; private IWidget previousWidget = null; private IEventListener globalListener; private boolean mousePressedOnWidget = false; + /** + * cretes a new ObservableWidget object. + */ public ObservableWidget() { super(); } + /** + * Copy constructor. + * + * @param widget + */ public ObservableWidget(ObservableWidget widget) { super(widget); this.enabled = widget.enabled; } + /** + * Returns true if this widget is enabled. If it is enabled it can recieve events. + * + * @return + */ public boolean isEnabled() { return enabled; } + /** + * Sets if this widget is focus traversable (usually with the Tab-Key). + * + * @param b + */ public void setTraversable(boolean b) { - if (b == isTraversable()) - return; - - if (b) - { - keyTraversalListener = new KeyAdapter() - { - public void keyPressed(KeyPressedEvent keyPressedEvent) - { - if (keyPressedEvent.getKeyClass() == Key.TAB) - { - IWidget w; - if (keyPressedEvent.isPressed(Key.SHIFT)) - { - w = getPreviousTraversableWidget(); - } - else - { - w = getNextTraversableWidget(); - } - - Display disp = getDisplay(); - if (disp != null) - disp.setFocusedWidget(w); - } - } - }; - keyHook.add(keyTraversalListener); - } - else - { - keyHook.remove(keyTraversalListener); - keyTraversalListener = null; - } + traversable = b; } + /** + * returns the next traversable widget. + * + * @return + */ public IWidget getNextTraversableWidget() { return getParent().getNextTraversableWidget(this); } + /** + * returns the previouse traversable widget. + * + * @return + */ public IWidget getPreviousTraversableWidget() { return getParent().getPreviousTraversableWidget(this); } - // public IWidget getNextWidget() - // { - // return getParent().getNextWidget(this); - // } - // - // public IWidget getPreviousWidget() - // { - // return getParent().getPreviousWidget(this); - // } - @Override public boolean isTraversable() { - return keyTraversalListener != null && enabled && isVisible(); + return traversable && enabled && isVisible(); } + /** + * Enable of disable this widget., + * + * @param enabled + */ public void setEnabled(boolean enabled) { if (this.enabled == enabled) @@ -173,17 +152,22 @@ this.activated(new ActivationEvent(this, enabled)); } + /** + * Called if this widget is de-/activated (enabled). + * + * @param e + */ public void activated(ActivationEvent e) { if (!isVisible() || !isInWidgetTree()) return; - + for (IActivationListener l : activationHook) { l.widgetActivationChanged(e); } } - + private ArrayList<IActivationListener> activationHook = new ArrayList<IActivationListener>(0); private ArrayList<IMouseEnteredListener> mouseEnteredHook = new ArrayList<IMouseEnteredListener>(0); private ArrayList<IMouseMovedListener> mouseMovedHook = new ArrayList<IMouseMovedListener>(0); @@ -199,21 +183,37 @@ private ArrayList<IMouseListener> mouseHook = new ArrayList<IMouseListener>(0); private ArrayList<IKeyListener> keyHook = new ArrayList<IKeyListener>(0); + /** + * adds a keylistener to this widget. + * @param l + */ public void addKeyListener(IKeyListener l) { keyHook.add(l); } + /** + * removes a keylistener from this widget + * @param l + */ public void removeKeyListener(IKeyListener l) { keyHook.remove(l); } + /** + * adds a mouselistener to this widget + * @param l + */ public void addMouseListener(IMouseListener l) { mouseHook.add(l); } + /** + * removes a mouselistener from this widget. + * @param l + */ public void removeMouseListener(IMouseListener l) { mouseHook.remove(l); @@ -327,11 +327,19 @@ mouseEnteredHook.remove(l); } + /** + * adds a focuslistener to this widget + * @param l + */ public void addFocusListener(IFocusListener l) { focusGainedHook.add(l); } + /** + * removes a focuslistener from this widget. + * @param l + */ public void removeFocusListener(IFocusListener l) { focusGainedHook.remove(l); @@ -349,6 +357,9 @@ mouseWheeledHook.remove(l); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseEntered(org.fenggui.event.mouse.MouseEnteredEvent) + */ public void mouseEntered(MouseEnteredEvent mouseEnteredEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -365,16 +376,27 @@ } } + /** + * adds a activationlistsner from this widget. + * @param l + */ public void addActivationListener(IActivationListener l) { activationHook.add(l); } + /** + * removes a activationlistener from this widget. + * @param l + */ public void removeActivationListener(IActivationListener l) { activationHook.remove(l); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseExited(org.fenggui.event.mouse.MouseExitedEvent) + */ public void mouseExited(MouseExitedEvent mouseExitedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -391,6 +413,9 @@ } } + /* (non-Javadoc) + * @see org.fenggui.Widget#mousePressed(org.fenggui.event.mouse.MousePressedEvent) + */ public void mousePressed(MousePressedEvent mousePressedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -411,6 +436,9 @@ super.mousePressed(mousePressedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseMoved(int, int) + */ public void mouseMoved(int displayX, int displayY) { if ((mouseHook.isEmpty() && mouseMovedHook.isEmpty()) || !enabled || !isVisible() || !isInWidgetTree()) @@ -431,6 +459,9 @@ super.mouseMoved(displayX, displayY); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseDragged(org.fenggui.event.mouse.MouseDraggedEvent) + */ public void mouseDragged(MouseDraggedEvent mouseDraggedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -482,6 +513,9 @@ super.mouseDoubleClicked(event); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseReleased(org.fenggui.event.mouse.MouseReleasedEvent) + */ public void mouseReleased(MouseReleasedEvent mouseReleasedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -501,11 +535,34 @@ super.mouseReleased(mouseReleasedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#keyPressed(org.fenggui.event.key.KeyPressedEvent) + */ public void keyPressed(KeyPressedEvent keyPressedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) return; + if (this.isTraversable()) + { + if (keyPressedEvent.getKeyClass() == Key.TAB) + { + IWidget w; + if (keyPressedEvent.isPressed(Key.SHIFT)) + { + w = getPreviousTraversableWidget(); + } + else + { + w = getNextTraversableWidget(); + } + + Display disp = getDisplay(); + if (disp != null) + disp.setFocusedWidget(w); + } + } + for (IKeyPressedListener l : keyPressedHook) { l.keyPressed(keyPressedEvent); @@ -518,6 +575,9 @@ super.keyPressed(keyPressedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#keyReleased(org.fenggui.event.key.KeyReleasedEvent) + */ public void keyReleased(KeyReleasedEvent keyReleasedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -535,6 +595,9 @@ super.keyReleased(keyReleasedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#keyTyped(org.fenggui.event.key.KeyTypedEvent) + */ public void keyTyped(KeyTypedEvent keyTypedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -552,6 +615,9 @@ super.keyTyped(keyTypedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#focusChanged(org.fenggui.event.FocusEvent) + */ public void focusChanged(FocusEvent focusGainedEvent) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -564,6 +630,9 @@ super.focusChanged(focusGainedEvent); } + /* (non-Javadoc) + * @see org.fenggui.Widget#mouseWheel(org.fenggui.event.mouse.MouseWheelEvent) + */ public void mouseWheel(MouseWheelEvent e) { if (!enabled || !isVisible() || !isInWidgetTree()) @@ -581,6 +650,9 @@ super.mouseWheel(e); } + /* (non-Javadoc) + * @see org.fenggui.Widget#toString() + */ @Override public String toString() { @@ -688,12 +760,11 @@ result.keyHook = new ArrayList<IKeyListener>(0); result.globalListener = null; - result.keyTraversalListener = null; result.setTraversable(this.isTraversable()); result.previousWidget = null; result.nextWidget = null; result.mousePressedOnWidget = false; - + return result; } } Modified: src/org/fenggui/StandardWidget.java =================================================================== --- src/org/fenggui/StandardWidget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/StandardWidget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -41,9 +41,19 @@ public abstract class StandardWidget extends Widget implements IXMLStreamable { + /** + * Returns the appearance of this widget. + * + * @return + */ public abstract IAppearance getAppearance(); - // public abstract void setAppearance(IAppearance appearance); + /** + * Implemented by subclasses to paint the content of the widget. + * + * @param g + * @param gl + */ public abstract void paintContent(Graphics g, IOpenGL gl); /** @@ -53,16 +63,27 @@ */ public abstract Dimension getMinContentSize(); + /** + * Creates a new StandardWidget object. + */ public StandardWidget() { super(); } + /** + * Copy constructor. + * + * @param widget + */ public StandardWidget(StandardWidget widget) { super(widget); } + /* (non-Javadoc) + * @see org.fenggui.Widget#getWidget(int, int) + */ public IWidget getWidget(int x, int y) { if (!isVisible()) @@ -83,6 +104,9 @@ return super.getWidget(x, y); } + /* (non-Javadoc) + * @see org.fenggui.Widget#paint(org.fenggui.binding.render.Graphics) + */ public void paint(Graphics g) { if (isVisible()) @@ -94,6 +118,9 @@ } } + /* (non-Javadoc) + * @see org.fenggui.Widget#updateMinSize() + */ public void updateMinSize() { Dimension minSize; @@ -151,6 +178,8 @@ * * @param clazz * the class type of the calling widget + * + * @deprecated use the FengGUI Factory class to create themed widgets. */ @Deprecated protected final void setupTheme(Class<?> clazz) @@ -159,6 +188,9 @@ FengGUI.getTheme().setUp(this); } + /* (non-Javadoc) + * @see org.fenggui.Widget#process(org.fenggui.theme.xml.InputOutputStream) + */ public void process(InputOutputStream stream) throws IOException, IXMLStreamableException { setExpandable(stream.processAttribute("expandable", isExpandable(), true)); @@ -182,6 +214,9 @@ // stream.processChild((IXMLStreamable)this.getTooltipData(), XMLTheme.TOOLTIPDATA_REGISTRY); } + /* (non-Javadoc) + * @see org.fenggui.Widget#getUniqueName() + */ public String getUniqueName() { return GENERATE_NAME; Modified: src/org/fenggui/StatefullWidget.java =================================================================== --- src/org/fenggui/StatefullWidget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/StatefullWidget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -28,11 +28,9 @@ /** * Implementation of a statefull Widget. All widgets where the user is able to interact - * with should be derived from this abstract class. <br/> <br/> Note that toggle buttons - * are not supported in the current implementation of Button. You can use a Checkbox with - * special Appearance for that.<br/> <br/> + * with should be derived from this abstract class. * - * This widget has the following states: default, focused, hovered and disabled. + * This widget has the following states: default, focused, hovered, error and disabled. * * @author marcmenghin, last edited by $Author$, $Date$ * @version $Revision$ @@ -52,7 +50,7 @@ private CursorType defaultHoverCursorType = CursorType.HAND; /** - * + * creates a new StatefullWidget. */ public StatefullWidget() { @@ -60,6 +58,8 @@ } /** + * Copy constructor. + * * @param widget */ public StatefullWidget(StatefullWidget<T> widget) @@ -167,6 +167,9 @@ } } + /** + * @param appearance + */ public void setAppearance(T appearance) { this.appearance = appearance; @@ -235,6 +238,9 @@ updateState(); } + /* (non-Javadoc) + * @see org.fenggui.ObservableWidget#toString() + */ @Override public String toString() { @@ -261,11 +267,17 @@ this.defaultHoverCursorType = defaultHoverCursorType; } + /** + * @return + */ public boolean hasError() { return error; } + /** + * @param error + */ public void setError(boolean error) { this.error = error; Modified: src/org/fenggui/Widget.java =================================================================== --- src/org/fenggui/Widget.java 2009-03-31 22:48:42 UTC (rev 615) +++ src/org/fenggui/Widget.java 2009-04-07 12:02:56 UTC (rev 616) @@ -45,7 +45,6 @@ import org.fenggui.theme.xml.IXMLStreamable; import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOutputStream; -import org.fenggui.tooltip.ITooltipData; import org.fenggui.util.Dimension; import org.fenggui.util.Log; import org.fenggui.util.Point; @@ -57,9 +56,8 @@ * The background spans over the content, padding and border, but * not over the margin.<br/> * <br/> - * The minium size of a widget is maintained by the widget itself and is - * always kept up - * to date, while the actual size of the widget is usually set by the layout manager. + * The minimum size of a widget is maintained by the widget itself and is + * always kept up to date, while the actual size of the widget is usually set by the layout manager. * Alternatively, one can set the actual size of a widget manually via the <code>setSize<method>. * * @@ -68,7 +66,7 @@ * @dedication Billie Holiday - They Can't Take That Away from Me * @see org.fenggui.background.Background * @see org.fenggui.border.Border - */ + */ public class Widget implements IWidget { @@ -78,10 +76,8 @@ private boolean shrinkable; private boolean expandable; private boolean visible; - private Map<String, Object> data = null; + private Map<String, Object> data = null; - private ITooltipData tooltip = null; - private ArrayList<ISizeChangedListener> sizeHook; private ArrayList<ISizeChangedListener> minSizeHook; private ArrayList<IPositionChangedListener> positionHook; @@ -109,7 +105,7 @@ */ public Widget() { - position = new Point(0,0); + position = new Point(0, 0); size = new Dimension(10, 10); minSize = new Dimension(10, 10); shrinkable = true; @@ -118,8 +114,8 @@ data = null; parent = null; layoutData = null; - - initHooks(); + + this.initHooks(); } /** @@ -132,20 +128,20 @@ this(); if (widget != null) { - this.position = new Point(widget.position); - this.size = new Dimension(widget.size); - this.minSize = new Dimension(widget.minSize); - this.shrinkable = widget.shrinkable; - this.expandable = widget.expandable; - this.visible = widget.visible; + position = new Point(widget.position); + size = new Dimension(widget.size); + minSize = new Dimension(widget.minSize); + shrinkable = widget.shrinkable; + expandable = widget.expandable; + visible = widget.visible; // TODO: copy this object aswell // this.layoutData = widget.layoutData - + data = null; parent = null; layoutData = null; - - initHooks(); + + this.initHooks(); } } @@ -184,6 +180,11 @@ return parent; } + /** + * Returns the minimum size of the widgets content. For this widget it's 0. + * + * @return + */ public Dimension getMinContentSize() { return new Dimension(0, 0); @@ -194,7 +195,7 @@ */ public void mouseEntered(MouseEnteredEvent mouseEnteredEvent) { - if (!mouseEnteredEvent.isAlreadyUsed() && this.getParent() != null) + if (!mouseEnteredEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseEntered(mouseEnteredEvent); } @@ -205,7 +206,7 @@ */ public void mouseExited(MouseExitedEvent mouseExitedEvent) { - if (!mouseExitedEvent.isAlreadyUsed() && this.getParent() != null) + if (!mouseExitedEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseExited(mouseExitedEvent); } @@ -216,7 +217,7 @@ */ public void mousePressed(MousePressedEvent mp) { - if (!mp.isAlreadyUsed() && this.getParent() != null) + if (!mp.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mousePressed(mp); } @@ -233,29 +234,12 @@ } } - /* - public void paint(Graphics g) - { - - } - - public void paintEverything(Graphics g) - { - if(getAppearance() != null) - { - getAppearance().beforePaint(g, g.getOpenGL()); - paint(g); - getAppearance().afterPaint(g, g.getOpenGL()); - } - } - - */ /* (non-Javadoc) * @see org.fenggui.IWidget#mouseDragged(org.fenggui.event.mouse.MouseDraggedEvent) */ public void mouseDragged(MouseDraggedEvent mp) { - if (!mp.isAlreadyUsed() && this.getParent() != null) + if (!mp.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseDragged(mp); } @@ -266,7 +250,7 @@ */ public void mouseReleased(MouseReleasedEvent mr) { - if (!mr.isAlreadyUsed() && this.getParent() != null) + if (!mr.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseReleased(mr); } @@ -277,7 +261,7 @@ */ public void mouseDoubleClicked(MouseDoubleClickedEvent event) { - if (!event.isAlreadyUsed() && this.getParent() != null) + if (!event.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseDoubleClicked(event); } @@ -288,7 +272,7 @@ */ public void mouseClicked(MouseClickedEvent event) { - if (!event.isAlreadyUsed() && this.getParent() != null) + if (!event.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseClicked(event); } @@ -299,7 +283,7 @@ */ public void mouseWheel(MouseWheelEvent mouseWheelEvent) { - if (!mouseWheelEvent.isAlreadyUsed() && this.getParent() != null) + if (!mouseWheelEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().mouseWheel(mouseWheelEvent); } @@ -310,7 +294,7 @@ */ public void keyPressed(KeyPressedEvent keyPressedEvent) { - if (!keyPressedEvent.isAlreadyUsed() && this.getParent() != null) + if (!keyPressedEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().keyPressed(keyPressedEvent); } @@ -321,7 +305,7 @@ */ public void keyReleased(KeyReleasedEvent keyReleasedEvent) { - if (!keyReleasedEvent.isAlreadyUsed() && this.getParent() != null) + if (!keyReleasedEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().keyReleased(keyReleasedEvent); } @@ -332,16 +316,21 @@ */ public void keyTyped(KeyTypedEvent keyTypedEvent) { - if (!keyTypedEvent.isAlreadyUsed() && this.getParent() != null) + if (!keyTypedEvent.isAlreadyUsed() && (this.getParent() != null)) { this.getParent().keyTyped(keyTypedEvent); } } + /* (non-Javadoc) + * @see org.fenggui.IWidget#positionChanged(org.fenggui.event.PositionChangedEvent) + */ public void positionChanged(PositionChangedEvent event) { - if (!isVisible() || !isInWidgetTree()) + if (!this.isVisible() || !this.isInWidgetTree()) + { return; + } for (IPositionChangedListener listener : positionHook) { @@ -349,10 +338,15 @@ } } + /* (non-Javadoc) + * @see org.fenggui.IWidget#sizeChanged(org.fenggui.event.SizeChangedEvent) + */ public void sizeChanged(SizeChangedEvent event) { - if (!isVisible() || !isInWidgetTree()) + if (!this.isVisible() || !this.isInWidgetTree()) + { return; + } for (ISizeChangedListener listener : sizeHook) { @@ -361,21 +355,33 @@ } + /* (non-Javadoc) + * @see org.fenggui.IWidget#addSizeChangedListener(org.fenggui.event.ISizeChangedListener) + */ public void addSizeChangedListener(ISizeChangedListener l) { sizeHook.add(l); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#removeSizeChangedListener(org.fenggui.event.ISizeChangedListener) + */ public void removeSizeChangedListener(ISizeChangedListener l) { sizeHook.remove(l); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#addPositionChangedListener(org.fenggui.event.IPositionChangedListener) + */ public void addPositionChangedListener(IPositionChangedListener l) { positionHook.add(l); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#removePositionChangedListener(org.fenggui.event.IPositionChangedListener) + */ public void removePositionChangedListener(IPositionChangedListener l) { positionHook.remove(l); @@ -387,8 +393,10 @@ */ public boolean isInWidgetTree() { - if (getDisplay() == null) + if (this.getDisplay() == null) + { return false; + } return true; } @@ -402,7 +410,7 @@ */ public void removedFromWidgetTree() { - // does nothing + // does nothing. Supposed to be overridden } /** @@ -411,66 +419,15 @@ */ public void addedToWidgetTree() { - // does nothing + // does nothing. Supposed to be overridden } - /** - * Draws the Widget in the given Graphics context. The origin of - * the Graphics context - * is set to the origin of the Widgets. A pixel drawn - * at 0, 0 would be drawn in the lower left corner of the Widget. - * The sequence of commands of this method is outlined in the following - * list. - * <ol> - * <li>Translate the origin to the border space and draw the border</li> - * <li>Translate the origin to the background space and draw the background</li> - * <li>Translate the origin to the internal space (by adding the padding to the - * current origin) and call the associated PaintListener - * (<code>getAppearance().getPaintListener().paint(g, this)</code>)</li> - * <li>Translate the origin back to the Widgets origin.</li> - * <ol> - * - */ - /* - public final void paintEverything(Graphics g) - { - */ - /* - if(background != null) - { - background.paint(g, - getMargin().getLeft() + getBorder().getLeft(), getMargin().getBottom() + getBorder().getBottom(), - getPadding().getLeftPlusRight() + getInnerSize().getWidth(), - getPadding().getBottomPlusTop() + getInnerSize().getHeight()); - } - - getBorder().paint(g, - getMargin().getLeft(), getMargin().getBottom(), - getPadding().getLeftPlusRight() + getInnerSize().getWidth(), - getPadding().getBottomPlusTop() + getInnerSize().getHeight()); - - g.translate(getLeftMargins(), getBottomMargins()); - - paint(g); - - g.translate(-getLeftMargins(), -getBottomMargins()); - */ - //} /* (non-Javadoc) - * @see org.fenggui.IWidget#paint(org.fenggui.render.Graphics) - - public void paint(Graphics g) - { - if(appearance != null) appearance.paint(g, g.getOpenGL()); - } - */ - - /* (non-Javadoc) * @see org.fenggui.IWidget#layout() */ public void layout() { - // does nothing + // does nothing. Supposed to be overridden } /* (non-Javadoc) @@ -479,10 +436,10 @@ public int getDisplayX() { // FIXME Is it the right thing to do, if parent == null ? - IBasicContainer parent = getParent(); + IBasicContainer parent = this.getParent(); if (parent != null) { - return parent.getDisplayX() + getX(); + return parent.getDisplayX() + this.getX(); } return 0; } @@ -493,10 +450,10 @@ public int getDisplayY() { // FIXME Is it the right thing to do, if parent == null ? - IBasicContainer parent = getParent(); + IBasicContainer parent = this.getParent(); if (parent != null) { - return parent.getDisplayY() + getY(); + return parent.getDisplayY() + this.getY(); } return 0; } @@ -507,8 +464,10 @@ public Display getDisplay() { if (parent == null) + { return null; - return getParent().getDisplay(); + } + return this.getParent().getDisplay(); } /* (non-Javadoc) @@ -516,22 +475,25 @@ */ public IWidget getWidget(int x, int y) { - /* - if(insideMargin(x, y)) return this; - return null; - */ - - if (isVisible() && x > 0 && y > 0 && x < getWidth() && y < getHeight()) + if (this.isVisible() && (x > 0) && (y > 0) && (x < this.getWidth()) && (y < this.getHeight())) + { return this; + } return null; } + /** + * Sets the widgets size to the minSize of the widget. + */ public void setSizeToMinSize() { - setSize(new Dimension(getMinSize())); + this.setSize(new Dimension(this.getMinSize())); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#setSize(org.fenggui.util.Dimension) + */ public void setSize(Dimension s) { Dimension oldSize = size; @@ -543,6 +505,7 @@ * Moves the Widget by adding x and y to the current position. * Note that usually the layout managers are responsible for positioning * Widgets, so hands off! + * * @param x pixel to the right * @param y pixel to the top */ @@ -554,6 +517,7 @@ /** * Convenience method to set the x and y coordinates of this * Widget + * * @param x the x coordinate * @param y the y coordinate */ @@ -567,6 +531,7 @@ */ public void updateMinSize() { + // does nothing. Supposed to be overridden } /** @@ -602,7 +567,7 @@ */ public void focusChanged(FocusEvent focusEvent) { - // does nothing. Supposed to be overriden + // does nothing. Supposed to be overridden } /** @@ -612,31 +577,37 @@ */ public void setY(int y) { - this.setPosition(new Point(getX(), y)); + this.setPosition(new Point(this.getX(), y)); } /* (non-Javadoc) * @see org.fenggui.IWidget#getY() */ - /* (non-Javadoc) - * @see org.fenggui.IWidget#getY() - */ public int getY() { return position.getY(); } + /** + * Returns true if this widget has the input focus. + * + * @return + */ public boolean hasFocus() { - Display d = getDisplay(); + Display d = this.getDisplay(); if (d == null) + { return false; + } IWidget w = d.getFocusedWidget(); if (w == null) + { return false; + } return w.equals(this); } @@ -649,46 +620,79 @@ return false; } + /** + * @return width of the widget + */ public int getWidth() { return size.getWidth(); } + /** + * @return height of the widget + */ public int getHeight() { return size.getHeight(); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#isExpandable() + */ public boolean isExpandable() { return expandable; } + /** + * Sets if this widget is expandable from its currently set size. + * + * @param expandable + */ public void setExpandable(boolean expandable) { this.expandable = expandable; } + /* (non-Javadoc) + * @see org.fenggui.IWidget#isShrinkable() + */ public boolean isShrinkable() { return shrinkable; } + /* (non-Javadoc) + * @see org.fenggui.IWidget#getSize() + */ public Dimension getSize() { return size; } + /* (non-Javadoc) + * @see org.fenggui.IWidget#getMinSize() + */ public Dimension getMinSize() { return minSize; } + /** + * Sets if this widget is shrinkable from its current size. + * + * @param shrinkable + */ public void setShrinkable(boolean shrinkable) { this.shrinkable = shrinkable; } + /** + * Sets the minimum size of this widget. This is usually set by the widget itself. + * + * @param dim + */ public void setMinSize(Dimension dim) { Dimension oldSize = minSize; @@ -696,67 +700,99 @@ this.minSizeChanged(new SizeChangedEvent(this, oldSize, minSize)); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#paint(org.fenggui.binding.render.Graphics) + */ public void paint(Graphics g) { // does nothing. Supposed to be overridden } + /* (non-Javadoc) + * @see org.fenggui.IWidget#getPosition() + */ public Point getPosition() { return position; } + /** + * @return returns the minimum width the widget wants. + */ public int getMinWidth() { - return getMinSize().getWidth(); + return this.getMinSize().getWidth(); } + /** + * @return returns the minimum height the widget wants. + */ public int getMinHeight() { - return getMinSize().getHeight(); + return this.getMinSize().getHeight(); } + /** + * Sets the minimum size of this widget. This is usually set by the widget itself. + * + * @param minWidth + * @param minHeight + */ public void setMinSize(int minWidth, int minHeight) { - setMinSize(new Dimension(minWidth, minHeight)); + this.setMinSize(new Dimension(minWidth, minHeight)); } + /** + * Sets the size of this widget. + * + * @param width + * @param height + */ public void setSize(int width, int height) { - setSize(new Dimension(width, height)); + this.setSize(new Dimension(width, height)); } + /** + * Sets the height of this widget. + * + * @param height + */ public void setHeight(int height) { - setSize(new Dimension(getWidth(), height)); + this.setSize(new Dimension(this.getWidth(), height)); } + /** + * Sets the width of this widget + * + * @param width + */ public void setWidth(int width) { - setSize(new Dimension(width, getHeight())); + this.setSize(new Dimension(width, this.getHeight())); } - /** - * Sets the local <code>x coordinate of this widget. Note that widget coordinates are measured - * in the coordinate system of its parent container. - * @param x <code>x coordinate + /* (non-Javadoc) + * @see org.fenggui.IWidget#setX(int) */ public void setX(int x) { - this.setPosition(new Point(x, getY())); + this.setPosition(new Point(x, this.getY())); } /* (non-Javadoc) * @see org.fenggui.IWidget#getX() */ - /** - * Abbreviation for <code>getPosition().getX()</code>. - */ public int getX() { return position.getX(); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#setPosition(org.fenggui.util.Point) + */ public void setPosition(Point p) { Point oldPosition = position; @@ -765,54 +801,72 @@ this.positionChanged(event); } + /* (non-Javadoc) + * @see org.fenggui.IWidget#isVisible() + */ public boolean isVisible() { - if (getParent() != null) - return visible && getParent().isVisible(); + if (this.getParent() != null) + { + return visible && this.getParent().isVisible(); + } else + { return visible; + } } + /* (non-Javadoc) + * @see org.fenggui.IWidget#setVisible(boolean) + */ public void setVisible(boolean visible) { this.visible = visible; - if (getParent() != null) + if (this.getParent() != null) { - // getParent().updateMinSize(); - getParent().layout(); + this.getParent().layout(); } } - public ITooltipData getTooltipData() - { - return tooltip; - } - - public void setTooltipData(ITooltipData data) - { - this.tooltip = data; - } - + /* (non-Javadoc) + * @see org.fenggui.IWidget#getData(java.lang.String) + */ public Object getData(String key) { - if (this.data == null) + if (data == null) + { return null; + } else - return this.data.get(key); + { + return data.get(key); + } } + /* (non-Javadoc) + * @see org.fenggui.IWidget#setData(java.lang.String, java.lang.Object) + */ public void setData(String key, Object data) { if (this.data == null) + { this.data = new HashMap<String, Object>(); - + } + this.data.put(key, data); } + /** + * called if the minSize of the widget changed. + * + * @param event + */ public void minSizeChanged(SizeChangedEvent event) { - if (!isVisible() || !isInWidgetTree()) + if (!this.isVisible() || !this.isInWidgetTree()) + { return; + } for (ISizeChangedListener listener : minSizeHook) { @@ -849,14 +903,13 @@ */ public void process(InputOutputStream stream) throws IOException, IXMLStreamableException { - //do nothing + // does nothing. Supposed to be overridden } /** * This will create a copy of the widget. This copy will be deep. The only restriction * is that it will not copy any content Items or child Widgets of this widget. */ - @Override public Widget clone() { Widget result; @@ -871,15 +924,14 @@ return null; } - result.position = this.position.clone(); - result.size = this.size.clone(); - result.minSize = this.minSize.clone(); + result.position = position.clone(); + result.size = size.clone(); + result.minSize = minSize.clone(); result.data = null; - result.tooltip = null; result.parent = null; result.layoutData = null; - + result.initHooks(); return result; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-03-31 22:48:51
|
Revision: 615 http://fenggui.svn.sourceforge.net/fenggui/?rev=615&view=rev Author: marcmenghin Date: 2009-03-31 22:48:42 +0000 (Tue, 31 Mar 2009) Log Message: ----------- - added a few missing characters to Alphabet - made FengGUI character spin depending on time not framerate - few fixes to the texteditor widget - added isValidCharacter(..) to determine if a character should be added to the texteditors content or not. Modified Paths: -------------- src/org/fenggui/StatefullWidget.java src/org/fenggui/TextEditor.java src/org/fenggui/text/EditableTextContentManager.java src/org/fenggui/text/content/ContentLine.java src/org/fenggui/text/content/ContentManager.java src/org/fenggui/text/content/ContentUserLine.java src/org/fenggui/text/content/part/AbstractContentPart.java src/org/fenggui/text/content/part/ImagePart.java src/org/fenggui/text/content/part/TextPart.java src/org/fenggui/util/Alphabet.java test/org/fenggui/example/ExampleBasisJOGL.java Modified: src/org/fenggui/StatefullWidget.java =================================================================== --- src/org/fenggui/StatefullWidget.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/StatefullWidget.java 2009-03-31 22:48:42 UTC (rev 615) @@ -275,12 +275,12 @@ /* (non-Javadoc) * @see org.fenggui.ObservableWidget#clone() */ + @SuppressWarnings("unchecked") @Override public StatefullWidget<T> clone() { StatefullWidget<T> result = (StatefullWidget<T>) super.clone(); - return result; } } Modified: src/org/fenggui/TextEditor.java =================================================================== --- src/org/fenggui/TextEditor.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/TextEditor.java 2009-03-31 22:48:42 UTC (rev 615) @@ -64,7 +64,7 @@ * @version $Revision$ * @dedication No Use For a Name - Invincible */ -public class TextEditor extends StatefullWidget<TextAppearance> implements ITextWidget +public class TextEditor extends StatefullWidget<TextAppearance> implements ITextWidget, Cloneable { // a few nice definitions to restirct userinput public static final String RESTRICT_NUMBERSONLY = "[0-9-+]+"; @@ -132,6 +132,8 @@ } }; + + buildSpecialEvents(); } /* (non-Javadoc) @@ -284,29 +286,25 @@ if (this.maxCharacters >= 0 && this.getText().length() >= this.maxCharacters && !textData.hasSelection()) return false; - if (!(e.getKey() == '\t') && !(e.isPressed(Key.META))) + if (!isReadonly() && Character.isDefined(e.getKey()) && !(e.isPressed(Key.META))) { - if (textData.isValidChar(e.getKey(), getAppearance()) && Character.isDefined(e.getKey())) + char character = e.getKey(); + + if (restrict != null && !restrict.matcher(Character.toString(character)).matches()) { - if (restrict != null && !restrict.matcher(Character.toString(e.getKey())).matches()) + return false; + } + + if (textData.isValidChar(character, getAppearance())) + { + if (this.isPasswordField()) { - return false; + this.passwordData += character; + character = passwordHideCharacter; } + result = textData.handleTextInput(character, getAppearance()); - if (e.getKeyClass() != Key.TAB) - if (!isReadonly()) - { - char character = e.getKey(); - if (this.isPasswordField()) - { - this.passwordData += character; - character = passwordHideCharacter; - } - result = textData.handleTextInput(character, getAppearance()); - - fireTextChangedEvent(null); - } - + fireTextChangedEvent(null); } } return result; @@ -783,4 +781,18 @@ return emptyData; } + /* (non-Javadoc) + * @see org.fenggui.StatefullWidget#clone() + */ + @Override + public StatefullWidget<TextAppearance> clone() + { + TextEditor result = (TextEditor) super.clone(); + + result.setAppearance(this.getAppearance().clone(result)); + result.setupDefaults(); + + return result; + } + } Modified: src/org/fenggui/text/EditableTextContentManager.java =================================================================== --- src/org/fenggui/text/EditableTextContentManager.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/EditableTextContentManager.java 2009-03-31 22:48:42 UTC (rev 615) @@ -603,7 +603,7 @@ */ public boolean isValidChar(char c, TextAppearance appearance) { - return true; + return manager.isValidCharacter(c, appearance); } /* (non-Javadoc) Modified: src/org/fenggui/text/content/ContentLine.java =================================================================== --- src/org/fenggui/text/content/ContentLine.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/ContentLine.java 2009-03-31 22:48:42 UTC (rev 615) @@ -1098,4 +1098,13 @@ return true; } + public boolean isValidCharacter(char character, TextAppearance appearance) + { + if (this.activePart != null) + { + return this.activePart.isValidCharacter(character, appearance); + } else { + return false; + } + } } Modified: src/org/fenggui/text/content/ContentManager.java =================================================================== --- src/org/fenggui/text/content/ContentManager.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/ContentManager.java 2009-03-31 22:48:42 UTC (rev 615) @@ -610,13 +610,16 @@ Point currentPos = activeLine.getActivePosition(appearance); - currentPos.setY(activeLineY + currentPos.getY() - activeLine.getSelectedLine().getSize().getHeight()); - if (currentPos.getY() < 0) + if (activeLine.getSelectedLine() != null) { - currentPos.setY(0); + currentPos.setY(activeLineY + currentPos.getY() - activeLine.getSelectedLine().getSize().getHeight()); + if (currentPos.getY() < 0) + { + currentPos.setY(0); + } + activeAtom = findAtomOnPosition(currentPos.getX(), currentPos.getY(), appearance); + setActiveAtom(this.activeAtom); } - activeAtom = findAtomOnPosition(currentPos.getX(), currentPos.getY(), appearance); - setActiveAtom(this.activeAtom); } } @@ -629,13 +632,16 @@ Point currentPos = activeLine.getActivePosition(appearance); - currentPos.setY(activeLineY + currentPos.getY() + (activeLine.getSelectedLine().getSize().getHeight())); - if (currentPos.getY() > getSize().getHeight()) + if (activeLine.getSelectedLine() != null) { - currentPos.setY(getSize().getHeight()); + currentPos.setY(activeLineY + currentPos.getY() + (activeLine.getSelectedLine().getSize().getHeight())); + if (currentPos.getY() > getSize().getHeight()) + { + currentPos.setY(getSize().getHeight()); + } + activeAtom = findAtomOnPosition(currentPos.getX(), currentPos.getY(), appearance); + setActiveAtom(this.activeAtom); } - activeAtom = findAtomOnPosition(currentPos.getX(), currentPos.getY(), appearance); - setActiveAtom(this.activeAtom); } } @@ -989,4 +995,16 @@ return true; } } + + public boolean isValidCharacter(char character, TextAppearance appearance) + { + if (activeLine != null) + { + return activeLine.isValidCharacter(character, appearance); + } + else + { + return false; + } + } } Modified: src/org/fenggui/text/content/ContentUserLine.java =================================================================== --- src/org/fenggui/text/content/ContentUserLine.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/ContentUserLine.java 2009-03-31 22:48:42 UTC (rev 615) @@ -828,4 +828,14 @@ this.UpdateContent(width, wordwarp, factory, appearance); return result; } + + public boolean isValidCharacter(char character, TextAppearance appearance) + { + if (this.activeLine != null) + { + return this.activeLine.isValidCharacter(character, appearance); + } else { + return false; + } + } } Modified: src/org/fenggui/text/content/part/AbstractContentPart.java =================================================================== --- src/org/fenggui/text/content/part/AbstractContentPart.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/part/AbstractContentPart.java 2009-03-31 22:48:42 UTC (rev 615) @@ -228,7 +228,17 @@ */ public abstract int getActiveAtom(); + /** + * Returns true if the given character is valid within this content part, false otherwise. + * + * @param character + * @param appearance + * @return + */ + public abstract boolean isValidCharacter(char character, TextAppearance appearance); + + /** * Returns the content of this contentPart in a reproducible form. Creating a new * content part with this String should result in the same content being displayed. * Modified: src/org/fenggui/text/content/part/ImagePart.java =================================================================== --- src/org/fenggui/text/content/part/ImagePart.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/part/ImagePart.java 2009-03-31 22:48:42 UTC (rev 615) @@ -248,4 +248,13 @@ throw new UnsupportedOperationException("No split supported in ImagePart."); } + /* (non-Javadoc) + * @see org.fenggui.text.content.part.AbstractContentPart#isValidCharacter(char, org.fenggui.appearance.TextAppearance) + */ + @Override + public boolean isValidCharacter(char character, TextAppearance appearance) + { + return false; + } + } Modified: src/org/fenggui/text/content/part/TextPart.java =================================================================== --- src/org/fenggui/text/content/part/TextPart.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/text/content/part/TextPart.java 2009-03-31 22:48:42 UTC (rev 615) @@ -459,4 +459,22 @@ return newPart; } + /* (non-Javadoc) + * @see org.fenggui.text.content.part.AbstractContentPart#isValidCharacter(char, org.fenggui.appearance.TextAppearance) + */ + @Override + public boolean isValidCharacter(char character, TextAppearance appearance) + { + TextStyleEntry style = appearance.getStyle(getStyleKey()).getTextStyleEntry(this.getStyleStateKey()); + + if (this.isSelected()) + { + return style.resolveRenderer(appearance).isValidChar(character); + } + else + { + return style.resolveRenderer(appearance).isValidChar(character); + } + } + } Modified: src/org/fenggui/util/Alphabet.java =================================================================== --- src/org/fenggui/util/Alphabet.java 2009-03-28 13:13:57 UTC (rev 614) +++ src/org/fenggui/util/Alphabet.java 2009-03-31 22:48:42 UTC (rev 615) @@ -79,7 +79,7 @@ } private char[] alphabet = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "`1234567890-=" - + "~!@#$%^&*()_+" + "[]{}\\|" + ":;\"'" + "<>,.?/ ").toCharArray(); + + "~!@#€µ$%^&*()_+" + "[]{}\\|" + ":;\"'" + "<>,.?/ ").toCharArray(); /** * Creates a standard character set (English) and adds the Modified: test/org/fenggui/example/ExampleBasisJOGL.java =================================================================== --- test/org/fenggui/example/ExampleBasisJOGL.java 2009-03-28 13:13:57 UTC (rev 614) +++ test/org/fenggui/example/ExampleBasisJOGL.java 2009-03-31 22:48:42 UTC (rev 615) @@ -18,9 +18,16 @@ */ package org.fenggui.example; -import static javax.media.opengl.GL.*; +import static javax.media.opengl.GL.GL_DEPTH_TEST; +import static javax.media.opengl.GL.GL_LEQUAL; +import static javax.media.opengl.GL.GL_LIGHTING; -import javax.media.opengl.*; +import java.util.Date; + +import javax.media.opengl.GL; +import javax.media.opengl.GLAutoDrawable; +import javax.media.opengl.GLCanvas; +import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU; import javax.swing.JFrame; @@ -48,6 +55,7 @@ private Display display = null; private GLEventListener eventListener = null; private float rotAngle = 0; + private long lastFrame = 0; private boolean runsAsWebstart = false; private FengCharacterRenderer fengRenderer = null; @@ -119,7 +127,15 @@ fengRenderer.display(); gl.glPopMatrix(); - rotAngle += 0.15; + long currentFrame = System.nanoTime(); + double delta = (currentFrame - lastFrame) * 0.0000001d; + + if (delta > 0) + { + rotAngle += 0.20 * delta; + + lastFrame = currentFrame; + } } public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) @@ -164,6 +180,7 @@ buildGUI(); + lastFrame = System.nanoTime(); screenshotActor = new ScreenshotActor(); screenshotActor.hook(display); } @@ -186,9 +203,9 @@ if (runsAsWebstart) { /* - Binding.getInstance().setUseClassLoader(true); - ITheme qtCurve = new ITheme("data/themes/QtCurve/QtCurve.xml"); - FengGUI.setTheme(qtCurve); */ + Binding.getInstance().setUseClassLoader(true); + ITheme qtCurve = new ITheme("data/themes/QtCurve/QtCurve.xml"); + FengGUI.setTheme(qtCurve); */ } Everything e = new Everything(runsAsWebstart); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-03-28 13:15:04
|
Revision: 614 http://fenggui.svn.sourceforge.net/fenggui/?rev=614&view=rev Author: marcmenghin Date: 2009-03-28 13:13:57 +0000 (Sat, 28 Mar 2009) Log Message: ----------- - clone handling improvements - documentation updates, cleanup Modified Paths: -------------- src/org/fenggui/Button.java src/org/fenggui/CheckBox.java src/org/fenggui/Container.java src/org/fenggui/DecoratorLayer.java src/org/fenggui/FengGUI.java src/org/fenggui/IWidget.java src/org/fenggui/Label.java src/org/fenggui/ModelWidget.java src/org/fenggui/ObservableLabelWidget.java src/org/fenggui/ObservableWidget.java src/org/fenggui/RadioButton.java src/org/fenggui/ScrollBar.java src/org/fenggui/ScrollContainer.java src/org/fenggui/Slider.java src/org/fenggui/StatefullWidget.java src/org/fenggui/Widget.java src/org/fenggui/actor/StaticTooltipActor.java src/org/fenggui/appearance/DecoratorAppearance.java src/org/fenggui/appearance/DefaultAppearance.java src/org/fenggui/appearance/EntryAppearance.java src/org/fenggui/appearance/GenericAppearance.java src/org/fenggui/appearance/LabelAppearance.java src/org/fenggui/appearance/SpacingAppearance.java src/org/fenggui/appearance/TextAppearance.java src/org/fenggui/decorator/background/Background.java src/org/fenggui/text/content/factory/simple/TextStyle.java src/org/fenggui/text/content/factory/simple/TextStyleEntry.java src/org/fenggui/tooltip/LabelTooltipManager.java src/org/fenggui/util/Color.java src/org/fenggui/util/Dimension.java src/org/fenggui/util/Point.java src/org/fenggui/util/Spacing.java src/org/fenggui/util/Util.java Property Changed: ---------------- / third-party/ Property changes on: ___________________________________________________________________ Modified: svn:ignore - bin passwords.properties deploy jogl_awt.dll jogl_cg.dll jogl.dll lwjgl.dll jinput-dx8.dll jinput-raw.dll OpenAL32.dll WIP doc .settings + bin passwords.properties deploy jogl_awt.dll jogl_cg.dll jogl.dll lwjgl.dll jinput-dx8.dll jinput-raw.dll OpenAL32.dll WIP doc .settings proguard_config.pro Modified: src/org/fenggui/Button.java =================================================================== --- src/org/fenggui/Button.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/Button.java 2009-03-28 13:13:57 UTC (rev 614) @@ -274,7 +274,7 @@ * @see org.fenggui.ObservableLabelWidget#clone() */ @Override - public Button clone() throws CloneNotSupportedException + public Button clone() { Button result = (Button) super.clone(); Modified: src/org/fenggui/CheckBox.java =================================================================== --- src/org/fenggui/CheckBox.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/CheckBox.java 2009-03-28 13:13:57 UTC (rev 614) @@ -216,7 +216,7 @@ * @see org.fenggui.ObservableLabelWidget#clone() */ @Override - public CheckBox<E> clone() throws CloneNotSupportedException + public CheckBox<E> clone() { CheckBox<E> result = (CheckBox<E>) super.clone(); Modified: src/org/fenggui/Container.java =================================================================== --- src/org/fenggui/Container.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/Container.java 2009-03-28 13:13:57 UTC (rev 614) @@ -907,7 +907,7 @@ * @see org.fenggui.Widget#clone() */ @Override - public Container clone() throws CloneNotSupportedException + public Container clone() { Container result = (Container) super.clone(); Modified: src/org/fenggui/DecoratorLayer.java =================================================================== --- src/org/fenggui/DecoratorLayer.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/DecoratorLayer.java 2009-03-28 13:13:57 UTC (rev 614) @@ -29,6 +29,7 @@ import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; +import org.fenggui.util.Log; /** * Class to make decorators usable for overlay effects such as selections bars in menus und @@ -96,7 +97,7 @@ for (IDecorator d : array) decorators.add(d); } - + public void clear() { decorators.clear(); @@ -109,12 +110,23 @@ { return GENERATE_NAME; } - - public DecoratorLayer clone() throws CloneNotSupportedException + + public DecoratorLayer clone() { - DecoratorLayer result = (DecoratorLayer) super.clone(); - + DecoratorLayer result; + try + { + result = (DecoratorLayer) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone DecoratorLayer", e); + return null; + } + //Decorators can't be changed so just add all to this layer + result.decorators = new ArrayList<IDecorator>(decorators.size()); result.decorators.addAll(decorators); return result; } Modified: src/org/fenggui/FengGUI.java =================================================================== --- src/org/fenggui/FengGUI.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/FengGUI.java 2009-03-28 13:13:57 UTC (rev 614) @@ -31,11 +31,11 @@ import org.fenggui.theme.DefaultTheme; import org.fenggui.theme.ITheme; import org.fenggui.theme.XMLTheme; -import org.fenggui.util.Log; import org.fenggui.util.Util; /** * This class provides some basic information about FengGUI to applications. + * Furthermore, it acts as a Factory class for Themed Widgets. * * @author Johannes Schaback, last edited by $Author$, $Date$ * @version $Revision$ @@ -123,15 +123,7 @@ //check prototype if (ptList.containsKey(widgetClass)) { - try - { - return (T) ptList.get(widgetClass).clone(); - } - catch (CloneNotSupportedException e) - { - Log.error("Couldn't clone a Widget that implements the Clonable interface. %1$s", e, widgetClass - .getSimpleName()); - } + return (T) ptList.get(widgetClass).clone(); } } @@ -140,14 +132,7 @@ if (cloneableClass) { - try - { - ptList.put(widgetClass, (T) widget.clone()); - } - catch (CloneNotSupportedException e) - { - Log.error("Couldn't clone a Widget that implements the Clonable interface. %1$s", e, widgetClass.getSimpleName()); - } + ptList.put(widgetClass, (T) widget.clone()); } return widget; @@ -863,33 +848,24 @@ public static ScrollBar createScrollBar(boolean horizontal) { ScrollBar c; - try + if (horizontal) { - if (horizontal) + if (ptScrollBarH == null) { - if (ptScrollBarH == null) - { - ptScrollBarH = new ScrollBar(horizontal); - FengGUI.setUpAppearance(ptScrollBarH); - } - c = ptScrollBarH.clone(); + ptScrollBarH = new ScrollBar(horizontal); + FengGUI.setUpAppearance(ptScrollBarH); } - else + c = ptScrollBarH.clone(); + } + else + { + if (ptScrollBarV == null) { - if (ptScrollBarV == null) - { - ptScrollBarV = new ScrollBar(horizontal); - FengGUI.setUpAppearance(ptScrollBarV); - } - c = ptScrollBarV.clone(); + ptScrollBarV = new ScrollBar(horizontal); + FengGUI.setUpAppearance(ptScrollBarV); } + c = ptScrollBarV.clone(); } - catch (CloneNotSupportedException e) - { - Log.warn("Couldn't clone ScrollBar. Creating new one.", e); - c = new ScrollBar(horizontal); - FengGUI.setUpAppearance(c); - } return c; } Modified: src/org/fenggui/IWidget.java =================================================================== --- src/org/fenggui/IWidget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/IWidget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -38,46 +38,88 @@ import org.fenggui.event.mouse.MouseWheelEvent; import org.fenggui.layout.ILayoutData; import org.fenggui.theme.xml.IXMLStreamable; -import org.fenggui.tooltip.ITooltipData; import org.fenggui.util.Dimension; import org.fenggui.util.Point; +/** + * A IWidget interface provides a definition for objects that represent a Widget. + * A Widget is the most basic entity of a GUI system. It is defined as a entity + * with a rectangular area. + * + * The minimum size of a widget is maintained by the widget itself and is + * always kept up to date, while the actual size of the widget is usually set + * by the layout manager. Alternatively, one can set the actual size of a widget + * manually via the {@link IWidget#setSize(Dimension)}. + */ public interface IWidget extends IXMLStreamable { + /** + * Returns the layout data associated with this widget. LayoutManagers will use + * this data to correctly layout the widget within the container. + * + * @return Data the LayoutManager of the parent Container will use or <code>null</code> if none. + */ public ILayoutData getLayoutData(); + /** + * Returns the parent container if there is one. Else it will return <code>null</code>. On the Display + * class this will always return <code>null</code>. + * + * @return parent container or <code>null</code>. + */ public IBasicContainer getParent(); - public Object clone() throws CloneNotSupportedException; - /** - * Called when the mouse enters this Widget + * The <code>clone</code> method creates a shallow copy of the Widget. The returned Widget will be + * independent of the current cloned Widget. Usually only the Widget will be cloned not its content. + * + * @return a clone of this instance. + */ + public IWidget clone(); + + /** + * Called on the hovered widget when the mouse enters the Widget + * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param mouseEnteredEvent event type */ public void mouseEntered(MouseEnteredEvent mouseEnteredEvent); /** - * Called when the mouse exits this Widget + * Called on the hovered widget when the mouse exits the Widget + * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param mouseExitedEvent event type */ public void mouseExited(MouseExitedEvent mouseExitedEvent); /** - * Called when a mouse button is pressed on this Widget. + * Called on the hovered widget when a mouse button is pressed. + * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param mp event type */ public void mousePressed(MousePressedEvent mp); /** - * Called when the mouse is moved over this Widget. Do not - * make computationally expensive things here because this + * Called on the hovered widget when the mouse pointer moves over the widget. + * Do not make computationally expensive things here because this * method is constantly called by Display * * @todo evaluate the idea to introduce a flag for Containers that * indicate whether the Container holds mouse-over sensitive Widgets * to avoid fining the underlying Widget on every mouse move event. # * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param displayX the x coordinate of the mouse cursor in display * coordinates * @param displayY the y coordinate of the mouse cursor in display @@ -86,61 +128,89 @@ public void mouseMoved(int displayX, int displayY); /** - * Called when the mouse is dragged (moved while pressing a - * mouse button down) over this Widget. + * Called on the hovered widget when the mouse is dragged (moved while pressing a + * mouse button down) over the Widget. * - * @todo mouseDragged is acutally only a special case of + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * + * @todo mouseDragged is actually only a special case of * mouseMoved. Consider to merge both events # * @param mp event type */ public void mouseDragged(MouseDraggedEvent mp); /** - * Called when a previously pressed mouse button is - * released - * on this Widget. + * Called on the hovered widget when a previously pressed mouse button is released + * on the Widget. It can not be expected that the mouse button was + * pressed on this widget. + * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param mr event type */ public void mouseReleased(MouseReleasedEvent mr); /** - * Called when the user clicks one something. + * Called on the hovered widget when the user clicks one something. This event is raised + * after a mousePressed and before a mouseReleased event occurs. * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param event event type */ public void mouseClicked(MouseClickedEvent event); /** - * Called when the mouse button is pressed twice in a short time. + * Called on the hovered widget when the mouse button is pressed twice in a short time. * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param event event type */ public void mouseDoubleClicked(MouseDoubleClickedEvent event); /** - * Called when there is a mouse wheel event + * Called on the hovered widget when there is a mouse wheel event. + * + * <p>Note: This event will travel from the hovered widget to the root of the visual + * tree (usually the Display object).</p> + * * @param mouseWheelEvent event type */ public void mouseWheel(MouseWheelEvent mouseWheelEvent); /** - * Called when a key is pressed on the keyboard providing - * this Widget has the focus. + * Called on the focused widget when a key is pressed on the keyboard. * + * <p>Note: This event will travel from the focused widget to the root of the visual + * tree (usually the Display object).</p> + * * @param keyPressedEvent event type */ public void keyPressed(KeyPressedEvent keyPressedEvent); /** - * Called when a previously pressed key on the keyboard - * is released, providing this Widget has the - * focus. + * Called on the focused widget when a previously pressed key on the keyboard + * is released. + * + * <p>Note: This event will travel from the focused widget to the root of the visual + * tree (usually the Display object).</p> + * * @param keyReleasedEvent event type */ public void keyReleased(KeyReleasedEvent keyReleasedEvent); /** - * Called when a key is Typed. + * Called on the focused widget when a key is Typed. This event is raised after a + * keyPressed event and before a keyReleased event. + * + * <p>Note: This event will travel from the focused widget to the root of the visual + * tree (usually the Display object).</p> + * * @param keyTypedEvent event type */ public void keyTyped(KeyTypedEvent keyTypedEvent); @@ -154,95 +224,197 @@ /** * Called of the position changed. + * * @param event */ public void positionChanged(PositionChangedEvent event); + /** + * Adds a listener to the sizeChanged event. + * + * @param l + */ public void addSizeChangedListener(ISizeChangedListener l); + /** + * Removes a listener form the sizeChanged event. + * + * @param l + */ public void removeSizeChangedListener(ISizeChangedListener l); + /** + * Adds a minSizeChanged listener. + * + * @param l + */ public void addMinSizeChangedListener(ISizeChangedListener l); + /** + * Removes a minSizeChanged listener. + * + * @param l + */ public void removeMinSizeChangedListener(ISizeChangedListener l); + /** + * Adds a listener to the positionChanged event. + * + * @param l + */ public void addPositionChangedListener(IPositionChangedListener l); + /** + * Removes a listener from the positionChanged listener. + * + * @param l + */ public void removePositionChangedListener(IPositionChangedListener l); - /* (non-Javadoc) - * @see org.fenggui.IWidget#getDisplayX() + /** + * Returns the absolute position of this widget within the Display. + * + * @return */ public int getDisplayX(); - /* (non-Javadoc) - * @see org.fenggui.IWidget#getDisplayY() + /** + * Returns the absolute position of this widget within the Display. + * + * @return */ public int getDisplayY(); - //public IAppearance getAppearance(); - - /* (non-Javadoc) - * @see org.fenggui.IWidget#getDisplay() + /** + * Returns the Display the Widget is in or <code>null</code> if its not added + * to any Display. + * + * @return */ public Display getDisplay(); - /* (non-Javadoc) - * @see org.fenggui.IWidget#getWidget(int, int) + /** + * Returns the widget that is on the given location or <code>null</code> if none is found. + * + * @param x local x value + * @param y local y value + * @return the widget that is on this location of <code>null</code> if none. */ public IWidget getWidget(int x, int y); - /* (non-Javadoc) - * @see org.fenggui.IWidget#updateMinSize() + /** + * Updates the minSize of the widget. Usually this should be handled by the Widgets themself. */ public void updateMinSize(); /** - * Called when a widget gets the focus - * + * Called when a widget gets or looses the focus. */ public void focusChanged(FocusEvent focusEvent); + /** + * Returns the current size of the widget. + * + * @return + */ public Dimension getSize(); + /** + * Returns the current minSize of the widget. + * + * @return + */ public Dimension getMinSize(); + /** + * Returns the current X position of the widget. + * + * @return + */ public int getX(); + /** + * Returns the current Y position of the widget. + * + * @return + */ public int getY(); + /** + * Returns the position of the widget. + * + * @return + */ public Point getPosition(); + /** + * Sets the position of the widget. + * + * @param p + */ public void setPosition(Point p); + /** + * Sets the X position of the widget. + * + * @param x + */ public void setX(int x); + /** + * Sets the Y position of the widget. + * + * @param y + */ public void setY(int y); - /* (non-Javadoc) - * @see org.fenggui.IWidget#isTraversable() + /** + * Returns true if the widget can be traversed to. + * + * @return */ public boolean isTraversable(); + /** + * This is called if the widget is removed from the widget Tree. + */ public void removedFromWidgetTree(); + /** + * Sets the parent of a widget. + * + * @param object + */ public void setParent(IBasicContainer object); + /** + * This is called if the widget is added to the widget Tree. This indicated that calls + * to getDisplay() should from now on not return null but the Display object. + */ public void addedToWidgetTree(); /** * Returns whether this widget is registered in a widget tree. + * * @return true if registered, else otherwise */ public boolean isInWidgetTree(); + /** + * Layouts the widgets content. + */ public void layout(); + /** + * Sets the size of the widget. + * + * @param d + */ public void setSize(Dimension d); /** * Checks if the widget is set to be visible or not. Doesn't check if the - * widget is actually drawn on screen. + * widget is actually drawn on screen or not. * * @return true if the widget should be visible. */ @@ -259,36 +431,36 @@ public void setVisible(boolean visible); /** - * Returns the TooltipData object associated with this widget or null if there - * is none. + * Returns true if the widget is expandable (default), false otherwise. + * LayoutManagers should respect this setting. * - * @return A TooltipData object or null. + * @return */ - public ITooltipData getTooltipData(); + public boolean isExpandable(); /** - * Sets the tooltipdata object for this widget. Set it to null to remove the - * tooltipdata object. + * Returns true if the widget is shrinkable (default), false otherwise. + * LayoutManagers should respect this setting. * - * @param data tooltip data object or null. + * @return */ - public void setTooltipData(ITooltipData data); - - public boolean isExpandable(); - public boolean isShrinkable(); + /** + * Draws the widget. + * + * @param g + */ public void paint(Graphics g); /** - * Set a custom data object. This is a method to associate arbitrary data - * with a widget. It is not removed or overwritten by FengGUI. The Idea is - * to use a HashMap with defined keys to reference data objects. + * Set a custom data object to the widget. This is a method to associate arbitrary data + * with a specific widget. * * @param data the data object * @see org.fenggui.util.Util */ - public void setCustomData(Object data); + public void setData(String key, Object data); /** * Returns the data object associated with this widget. @@ -296,5 +468,5 @@ * @return a data object. * @see org.fenggui.util.Util */ - public Object getCustomData(); + public Object getData(String key); } \ No newline at end of file Modified: src/org/fenggui/Label.java =================================================================== --- src/org/fenggui/Label.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/Label.java 2009-03-28 13:13:57 UTC (rev 614) @@ -272,7 +272,7 @@ * @see org.fenggui.Widget#clone() */ @Override - public Label clone() throws CloneNotSupportedException + public Label clone() { Label result = (Label) super.clone(); Modified: src/org/fenggui/ModelWidget.java =================================================================== --- src/org/fenggui/ModelWidget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/ModelWidget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -117,7 +117,7 @@ */ @SuppressWarnings("unchecked") @Override - public ModelWidget<T, M> clone() throws CloneNotSupportedException + public ModelWidget<T, M> clone() { ModelWidget<T, M> result = (ModelWidget<T, M>) super.clone(); Modified: src/org/fenggui/ObservableLabelWidget.java =================================================================== --- src/org/fenggui/ObservableLabelWidget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/ObservableLabelWidget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -282,7 +282,7 @@ * @see org.fenggui.StatefullWidget#clone() */ @Override - public ObservableLabelWidget clone() throws CloneNotSupportedException + public ObservableLabelWidget clone() { ObservableLabelWidget result = (ObservableLabelWidget) super.clone(); Modified: src/org/fenggui/ObservableWidget.java =================================================================== --- src/org/fenggui/ObservableWidget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/ObservableWidget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -668,7 +668,7 @@ * @see org.fenggui.Widget#clone() */ @Override - public ObservableWidget clone() throws CloneNotSupportedException + public ObservableWidget clone() { ObservableWidget result = (ObservableWidget) super.clone(); Modified: src/org/fenggui/RadioButton.java =================================================================== --- src/org/fenggui/RadioButton.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/RadioButton.java 2009-03-28 13:13:57 UTC (rev 614) @@ -186,7 +186,7 @@ * @see org.fenggui.ObservableLabelWidget#clone() */ @Override - public RadioButton<E> clone() throws CloneNotSupportedException + public RadioButton<E> clone() { RadioButton<E> result = (RadioButton<E>) super.clone(); result.value = null; Modified: src/org/fenggui/ScrollBar.java =================================================================== --- src/org/fenggui/ScrollBar.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/ScrollBar.java 2009-03-28 13:13:57 UTC (rev 614) @@ -389,7 +389,7 @@ * @see org.fenggui.Widget#clone() */ @Override - public ScrollBar clone() throws CloneNotSupportedException + public ScrollBar clone() { ScrollBar result = (ScrollBar) super.clone(); Modified: src/org/fenggui/ScrollContainer.java =================================================================== --- src/org/fenggui/ScrollContainer.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/ScrollContainer.java 2009-03-28 13:13:57 UTC (rev 614) @@ -965,7 +965,7 @@ * @see org.fenggui.Widget#clone() */ @Override - public ScrollContainer clone() throws CloneNotSupportedException + public ScrollContainer clone() { ScrollContainer result = (ScrollContainer) super.clone(); Modified: src/org/fenggui/Slider.java =================================================================== --- src/org/fenggui/Slider.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/Slider.java 2009-03-28 13:13:57 UTC (rev 614) @@ -553,7 +553,7 @@ * @see org.fenggui.StatefullWidget#clone() */ @Override - public Slider clone() throws CloneNotSupportedException + public Slider clone() { Slider result = (Slider) super.clone(); Modified: src/org/fenggui/StatefullWidget.java =================================================================== --- src/org/fenggui/StatefullWidget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/StatefullWidget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -276,7 +276,7 @@ * @see org.fenggui.ObservableWidget#clone() */ @Override - public StatefullWidget<T> clone() throws CloneNotSupportedException + public StatefullWidget<T> clone() { StatefullWidget<T> result = (StatefullWidget<T>) super.clone(); Modified: src/org/fenggui/Widget.java =================================================================== --- src/org/fenggui/Widget.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/Widget.java 2009-03-28 13:13:57 UTC (rev 614) @@ -21,19 +21,33 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import org.fenggui.binding.render.Graphics; -import org.fenggui.event.*; +import org.fenggui.event.FocusEvent; +import org.fenggui.event.IPositionChangedListener; +import org.fenggui.event.ISizeChangedListener; +import org.fenggui.event.PositionChangedEvent; +import org.fenggui.event.SizeChangedEvent; import org.fenggui.event.key.KeyPressedEvent; import org.fenggui.event.key.KeyReleasedEvent; import org.fenggui.event.key.KeyTypedEvent; -import org.fenggui.event.mouse.*; +import org.fenggui.event.mouse.MouseClickedEvent; +import org.fenggui.event.mouse.MouseDoubleClickedEvent; +import org.fenggui.event.mouse.MouseDraggedEvent; +import org.fenggui.event.mouse.MouseEnteredEvent; +import org.fenggui.event.mouse.MouseExitedEvent; +import org.fenggui.event.mouse.MousePressedEvent; +import org.fenggui.event.mouse.MouseReleasedEvent; +import org.fenggui.event.mouse.MouseWheelEvent; import org.fenggui.layout.ILayoutData; import org.fenggui.theme.xml.IXMLStreamable; import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.tooltip.ITooltipData; import org.fenggui.util.Dimension; +import org.fenggui.util.Log; import org.fenggui.util.Point; /** @@ -64,7 +78,7 @@ private boolean shrinkable; private boolean expandable; private boolean visible; - private Object data = null; + private Map<String, Object> data = null; private ITooltipData tooltip = null; @@ -779,14 +793,20 @@ this.tooltip = data; } - public Object getCustomData() + public Object getData(String key) { - return data; + if (this.data == null) + return null; + else + return this.data.get(key); } - public void setCustomData(Object data) + public void setData(String key, Object data) { - this.data = data; + if (this.data == null) + this.data = new HashMap<String, Object>(); + + this.data.put(key, data); } public void minSizeChanged(SizeChangedEvent event) @@ -837,9 +857,19 @@ * is that it will not copy any content Items or child Widgets of this widget. */ @Override - public Widget clone() throws CloneNotSupportedException + public Widget clone() { - Widget result = (Widget) super.clone(); + Widget result; + try + { + result = (Widget) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Widget", e); + return null; + } result.position = this.position.clone(); result.size = this.size.clone(); Modified: src/org/fenggui/actor/StaticTooltipActor.java =================================================================== --- src/org/fenggui/actor/StaticTooltipActor.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/actor/StaticTooltipActor.java 2009-03-28 13:13:57 UTC (rev 614) @@ -23,7 +23,13 @@ import org.fenggui.Display; import org.fenggui.IContainer; import org.fenggui.IWidget; -import org.fenggui.event.*; +import org.fenggui.event.Event; +import org.fenggui.event.FocusEvent; +import org.fenggui.event.IEventListener; +import org.fenggui.event.IPositionChangedListener; +import org.fenggui.event.ISizeChangedListener; +import org.fenggui.event.PositionChangedEvent; +import org.fenggui.event.SizeChangedEvent; import org.fenggui.util.Dimension; import org.fenggui.util.Util; @@ -208,7 +214,7 @@ private Object getTooltipDataFromWidget(IWidget widget) { - return Util.getCustomData(widget, TOOLTIPOBJECTIDENT); + return widget.getData(TOOLTIPOBJECTIDENT); } /** @@ -222,8 +228,8 @@ * there was no data. (A null return can also indicate that the tooltip data * previously associated with the widget was null.) */ - public static Object setTooltipDataToWidget(IWidget widget, Object data) + public static void setTooltipDataToWidget(IWidget widget, Object data) { - return Util.setCustomData(widget, TOOLTIPOBJECTIDENT, data); + widget.setData(TOOLTIPOBJECTIDENT, data); } } Modified: src/org/fenggui/appearance/DecoratorAppearance.java =================================================================== --- src/org/fenggui/appearance/DecoratorAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/DecoratorAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -314,7 +314,7 @@ * @see org.fenggui.appearance.SpacingAppearance#clone(org.fenggui.StandardWidget) */ @Override - protected DecoratorAppearance clone(StandardWidget widget) throws CloneNotSupportedException + protected DecoratorAppearance clone(StandardWidget widget) { DecoratorAppearance result = (DecoratorAppearance) super.clone(widget); Modified: src/org/fenggui/appearance/DefaultAppearance.java =================================================================== --- src/org/fenggui/appearance/DefaultAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/DefaultAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -59,7 +59,7 @@ * @see org.fenggui.appearance.GenericAppearance#clone(org.fenggui.StandardWidget) */ @Override - public DefaultAppearance clone(StandardWidget widget) throws CloneNotSupportedException + public DefaultAppearance clone(StandardWidget widget) { return (DefaultAppearance) super.clone(widget); } Modified: src/org/fenggui/appearance/EntryAppearance.java =================================================================== --- src/org/fenggui/appearance/EntryAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/EntryAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -152,7 +152,7 @@ * @see org.fenggui.appearance.LabelAppearance#clone(org.fenggui.StandardWidget) */ @Override - public LabelAppearance clone(StandardWidget widget) throws CloneNotSupportedException + public LabelAppearance clone(StandardWidget widget) { EntryAppearance result = (EntryAppearance) super.clone(widget); Modified: src/org/fenggui/appearance/GenericAppearance.java =================================================================== --- src/org/fenggui/appearance/GenericAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/GenericAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -33,6 +33,7 @@ import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Alignment; import org.fenggui.util.Color; +import org.fenggui.util.Log; import org.fenggui.util.Spacing; /** @@ -48,7 +49,7 @@ private Map<String, IntegerStore> integers = null; private Map<String, Spacing> spacings = null; private Map<String, IDecorator> decorators = null; - private Map<String, Alignment> alignments = null; + private Map<String, Alignment> alignments = null; /** * Internal Class to store integer values as XML elements @@ -85,9 +86,19 @@ * @see java.lang.Object#clone() */ @Override - public IntegerStore clone() throws CloneNotSupportedException + public IntegerStore clone() { - IntegerStore result = (IntegerStore) super.clone(); + IntegerStore result; + try + { + result = (IntegerStore) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone IntegerStore", e); + return null; + } result.value = new Integer(this.value.intValue()); return result; } @@ -133,7 +144,7 @@ spacings = new HashMap<String, Spacing>(); decorators = new HashMap<String, IDecorator>(); alignments = new HashMap<String, Alignment>(); - + stream.processChildren("Pixmap", pixmaps, Pixmap.class); stream.processChildren("Color", colors, Color.class); stream.processChildren("Integer", integers, IntegerStore.class); @@ -252,7 +263,7 @@ * @see org.fenggui.appearance.DecoratorAppearance#clone(org.fenggui.StandardWidget) */ @Override - protected DecoratorAppearance clone(StandardWidget widget) throws CloneNotSupportedException + protected DecoratorAppearance clone(StandardWidget widget) { GenericAppearance result = (GenericAppearance) super.clone(widget); @@ -297,7 +308,7 @@ for (Entry<String, Pixmap> align : this.pixmaps.entrySet()) result.pixmaps.put(align.getKey(), align.getValue()); } - + return result; } Modified: src/org/fenggui/appearance/LabelAppearance.java =================================================================== --- src/org/fenggui/appearance/LabelAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/LabelAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -78,7 +78,7 @@ * @see org.fenggui.appearance.TextAppearance#clone(org.fenggui.StandardWidget) */ @Override - public LabelAppearance clone(StandardWidget widget) throws CloneNotSupportedException + public LabelAppearance clone(StandardWidget widget) { return (LabelAppearance) super.clone(widget); } Modified: src/org/fenggui/appearance/SpacingAppearance.java =================================================================== --- src/org/fenggui/appearance/SpacingAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/SpacingAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -28,6 +28,7 @@ import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Dimension; +import org.fenggui.util.Log; import org.fenggui.util.Spacing; /** @@ -102,7 +103,7 @@ widget = w; this.process(stream); } - + /** * Returns the space reserved for borders. * @return the border spacing @@ -336,14 +337,24 @@ /* (non-Javadoc) * @see java.lang.Object#clone() */ - protected SpacingAppearance clone(StandardWidget widget) throws CloneNotSupportedException + protected SpacingAppearance clone(StandardWidget widget) { - SpacingAppearance result = (SpacingAppearance) super.clone(); + SpacingAppearance result; + try + { + result = (SpacingAppearance) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Appearance", e); + return null; + } result.border = this.border.clone(); result.margin = this.margin.clone(); result.padding = this.padding.clone(); result.widget = widget; - + return result; } } Modified: src/org/fenggui/appearance/TextAppearance.java =================================================================== --- src/org/fenggui/appearance/TextAppearance.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/appearance/TextAppearance.java 2009-03-28 13:13:57 UTC (rev 614) @@ -187,7 +187,7 @@ * @see org.fenggui.appearance.DefaultAppearance#clone(org.fenggui.StandardWidget) */ @Override - public TextAppearance clone(StandardWidget widget) throws CloneNotSupportedException + public TextAppearance clone(StandardWidget widget) { TextAppearance result = (TextAppearance) super.clone(widget); Modified: src/org/fenggui/decorator/background/Background.java =================================================================== --- src/org/fenggui/decorator/background/Background.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/decorator/background/Background.java 2009-03-28 13:13:57 UTC (rev 614) @@ -27,6 +27,11 @@ * provide the <code>paint</code> method which will be overriden * by specific background implementations. * + * <br/> + * The background spans over the content, padding and border, but + * not over the margin.<br/> + * <br/> + * * @author Johannes Schaback * @version $Revision$ */ Modified: src/org/fenggui/text/content/factory/simple/TextStyle.java =================================================================== --- src/org/fenggui/text/content/factory/simple/TextStyle.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/text/content/factory/simple/TextStyle.java 2009-03-28 13:13:57 UTC (rev 614) @@ -26,6 +26,7 @@ import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; +import org.fenggui.util.Log; /** * @author Marc Menghin @@ -102,17 +103,27 @@ { stream.processChildren("Style", styles, TextStyleEntry.class); } - + @Override - public TextStyle clone() throws CloneNotSupportedException + public TextStyle clone() { - TextStyle result = (TextStyle) super.clone(); - - for (Entry<String, TextStyleEntry> entry: this.styles.entrySet()) + TextStyle result; + try { + result = (TextStyle) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone TextStyle", e); + return null; + } + + for (Entry<String, TextStyleEntry> entry : this.styles.entrySet()) + { result.styles.put(entry.getKey(), entry.getValue().clone()); } - + return result; } } Modified: src/org/fenggui/text/content/factory/simple/TextStyleEntry.java =================================================================== --- src/org/fenggui/text/content/factory/simple/TextStyleEntry.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/text/content/factory/simple/TextStyleEntry.java 2009-03-28 13:13:57 UTC (rev 614) @@ -29,6 +29,7 @@ import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Color; +import org.fenggui.util.Log; /** * @author Marc Menghin @@ -144,17 +145,27 @@ { return appearance.getRenderer(this.fontStyle); } - + @Override - public TextStyleEntry clone() throws CloneNotSupportedException + public TextStyleEntry clone() { - TextStyleEntry result = (TextStyleEntry) super.clone(); - + TextStyleEntry result; + try + { + result = (TextStyleEntry) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone TextStyleEntry", e); + return null; + } + result.color = this.color.clone(); result.selectionColor = this.selectionColor.clone(); result.background = this.background.clone(); result.selectionBackground = this.selectionBackground.clone(); - + return result; } } Modified: src/org/fenggui/tooltip/LabelTooltipManager.java =================================================================== --- src/org/fenggui/tooltip/LabelTooltipManager.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/tooltip/LabelTooltipManager.java 2009-03-28 13:13:57 UTC (rev 614) @@ -34,6 +34,8 @@ public class LabelTooltipManager extends Label implements ITooltipManager { + public final static String DATAKEY_LABELTOOLTIP = "DATAKEY_LabelTooltip"; + public LabelTooltipManager() { super(); @@ -46,7 +48,7 @@ public void showTooltip(IWidget widget) { - ITooltipData tooltip = (ITooltipData) widget.getTooltipData(); + ITooltipData tooltip = (ITooltipData) widget.getData(DATAKEY_LABELTOOLTIP); if (tooltip != null) { Modified: src/org/fenggui/util/Color.java =================================================================== --- src/org/fenggui/util/Color.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/util/Color.java 2009-03-28 13:13:57 UTC (rev 614) @@ -575,8 +575,17 @@ * @see java.lang.Object#clone() */ @Override - public Color clone() throws CloneNotSupportedException + public Color clone() { - return (Color) super.clone(); + try + { + return (Color) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Color", e); + return null; + } } } Modified: src/org/fenggui/util/Dimension.java =================================================================== --- src/org/fenggui/util/Dimension.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/util/Dimension.java 2009-03-28 13:13:57 UTC (rev 614) @@ -58,9 +58,18 @@ * @see java.lang.Object#clone() */ @Override - public Dimension clone() throws CloneNotSupportedException + public Dimension clone() { - return (Dimension) super.clone(); + try + { + return (Dimension) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Dimension", e); + return null; + } } /** Modified: src/org/fenggui/util/Point.java =================================================================== --- src/org/fenggui/util/Point.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/util/Point.java 2009-03-28 13:13:57 UTC (rev 614) @@ -173,8 +173,17 @@ * @see java.lang.Object#clone() */ @Override - public Point clone() throws CloneNotSupportedException + public Point clone() { - return (Point) super.clone(); + try + { + return (Point) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Point", e); + return null; + } } } Modified: src/org/fenggui/util/Spacing.java =================================================================== --- src/org/fenggui/util/Spacing.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/util/Spacing.java 2009-03-28 13:13:57 UTC (rev 614) @@ -256,10 +256,18 @@ * @see java.lang.Object#clone() */ @Override - public Spacing clone() throws CloneNotSupportedException + public Spacing clone() { - return (Spacing) super.clone(); + try + { + return (Spacing) super.clone(); + } + catch (CloneNotSupportedException e) + { + //can not happen but write out anyway + Log.error("Couldn't clone Spacing", e); + return null; + } } - - + } Modified: src/org/fenggui/util/Util.java =================================================================== --- src/org/fenggui/util/Util.java 2009-03-25 22:02:20 UTC (rev 613) +++ src/org/fenggui/util/Util.java 2009-03-28 13:13:57 UTC (rev 614) @@ -21,13 +21,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.fenggui.IContainer; -import org.fenggui.IWidget; - /** * Utility class with helpful methods. * @@ -42,92 +36,6 @@ } /** - * Adds data to the given widget. It uses a HashMap to store the key - data values pairs. - * - * @param widget Widget to store the data to. - * @param key key for the data. - * @param data data to store. - * @return the previous data associated with the widget, or null if - * there was no data. (A null return can also indicate that the data - * previously associated with the widget was null.) - */ - public static Object setCustomData(IWidget widget, String key, Object data) - { - Object rawData = widget.getCustomData(); - if (rawData == null) - { - rawData = new HashMap<String, Object>(0); - widget.setCustomData(rawData); - } - - if (rawData instanceof Map) - { - Map mapData = (Map) rawData; - return mapData.put(key, data); - } - else - { - throw new UnsupportedOperationException("Already a CustomData object present on widget which is not a Map"); - } - } - - /** - * Receives the data from a widget. - * - * - * @param widget widget to receive data from - * @param key key of the data object - * @return data associated with the key or null if data was null or no data was found. - */ - public static Object getCustomData(IWidget widget, String key) - { - Object rawData = widget.getCustomData(); - if (rawData == null) - return null; - - if (rawData instanceof Map) - { - Map mapData = (Map) rawData; - return mapData.get(key); - } - - return null; - } - - /** - * This method recursively searches for the first widget that has the data - * object assigned to it using the given key. - * - * @param root - * @param key - * @param data - * @return Widget with the data object or null if none found. - */ - public static IWidget findWidgetWithData(IWidget root, String key, Object data) - { - if (data.equals(getCustomData(root, key))) - { - return root; - } - - if (root instanceof IContainer) - { - IContainer container = (IContainer) root; - List<IWidget> childs = container.getContent(); - - for (IWidget widget : childs) - { - IWidget result = findWidgetWithData(widget, key, data); - if (result != null) - return result; - } - } - - return null; - } - - - /** * Tries to create a instance of the given class over an empty constructor. Returns null * if it didn't find such a constructor of if it couldn't create a instance over it. * Property changes on: third-party ___________________________________________________________________ Added: svn:ignore + *.so This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-03-25 22:02:38
|
Revision: 613 http://fenggui.svn.sourceforge.net/fenggui/?rev=613&view=rev Author: marcmenghin Date: 2009-03-25 22:02:20 +0000 (Wed, 25 Mar 2009) Log Message: ----------- - added .clone() implementation to most important widgets and classes so generic FengGUI.createWidget(..) is able to clone them instead of recreating and theming them for each call. - fixed a bug where a Container didn't layout after the minSize of a child changed. - added methods to XML Theming to handle Enums more generically - updated more examples to use new FengGUI.createWidget method Modified Paths: -------------- src/org/fenggui/Button.java src/org/fenggui/CheckBox.java src/org/fenggui/Container.java src/org/fenggui/DecoratorLayer.java src/org/fenggui/FengGUI.java src/org/fenggui/Label.java src/org/fenggui/ModelWidget.java src/org/fenggui/ObservableLabelWidget.java src/org/fenggui/ObservableWidget.java src/org/fenggui/RadioButton.java src/org/fenggui/ScrollBar.java src/org/fenggui/ScrollContainer.java src/org/fenggui/Slider.java src/org/fenggui/StatefullWidget.java src/org/fenggui/Widget.java src/org/fenggui/appearance/DecoratorAppearance.java src/org/fenggui/appearance/DefaultAppearance.java src/org/fenggui/appearance/DummyAppearance.java src/org/fenggui/appearance/EntryAppearance.java src/org/fenggui/appearance/GenericAppearance.java src/org/fenggui/appearance/LabelAppearance.java src/org/fenggui/appearance/SpacingAppearance.java src/org/fenggui/appearance/TextAppearance.java src/org/fenggui/text/content/factory/simple/TextStyle.java src/org/fenggui/text/content/factory/simple/TextStyleEntry.java src/org/fenggui/theme/xml/InputOutputStream.java src/org/fenggui/theme/xml/XMLInputStream.java src/org/fenggui/theme/xml/XMLOutputStream.java src/org/fenggui/util/Alignment.java src/org/fenggui/util/Color.java src/org/fenggui/util/Dimension.java src/org/fenggui/util/Point.java src/org/fenggui/util/Rectangle.java src/org/fenggui/util/Spacing.java test/org/fenggui/example/CheckBoxExample.java test/org/fenggui/example/FontExample.java test/org/fenggui/example/RadioButtonExample.java test/org/fenggui/example/ScrollBarExample.java Removed Paths: ------------- src/org/fenggui/appearance/ContainerEntryAppearance.java Modified: src/org/fenggui/Button.java =================================================================== --- src/org/fenggui/Button.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/Button.java 2009-03-25 22:02:20 UTC (rev 613) @@ -54,7 +54,7 @@ */ public class Button extends ObservableLabelWidget { - private java.util.List<IButtonPressedListener> buttonPressedHook = new ArrayList<IButtonPressedListener>(); + private java.util.List<IButtonPressedListener> buttonPressedHook; public static final String STATE_PRESSED = "pressed"; private boolean pressed = false; @@ -72,20 +72,25 @@ public Button(String text) { + setTraversable(true); + initDefaults(); + setText(text); - initDefaults(); } public Button(InputOnlyStream stream) throws IOException, IXMLStreamableException { process(stream); + setTraversable(true); initDefaults(); } private void initDefaults() { + buttonPressedHook = new ArrayList<IButtonPressedListener>(); + pressed = false; + disableDefaultStates(); - setTraversable(true); updateState(); updateMinSize(); } @@ -264,4 +269,17 @@ l.buttonPressed(e); } } + + /* (non-Javadoc) + * @see org.fenggui.ObservableLabelWidget#clone() + */ + @Override + public Button clone() throws CloneNotSupportedException + { + Button result = (Button) super.clone(); + + result.initDefaults(); + + return result; + } } Modified: src/org/fenggui/CheckBox.java =================================================================== --- src/org/fenggui/CheckBox.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/CheckBox.java 2009-03-25 22:02:20 UTC (rev 613) @@ -24,10 +24,8 @@ import org.fenggui.event.ISelectionChangedListener; import org.fenggui.event.SelectionChangedEvent; import org.fenggui.event.key.Key; -import org.fenggui.event.key.KeyAdapter; -import org.fenggui.event.key.KeyPressedEvent; -import org.fenggui.event.mouse.MouseAdapter; -import org.fenggui.event.mouse.MousePressedEvent; +import org.fenggui.event.key.KeyTypedEvent; +import org.fenggui.event.mouse.MouseClickedEvent; import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOutputStream; @@ -59,46 +57,6 @@ this(""); } - public CheckBox(CheckBox<E> checkBox) - { - super(checkBox); - buildLogic(); - - getAppearance().setEnabled(STATE_SELECTED, false); - getAppearance().setEnabled(STATE_DESELECTED, true); - setTraversable(true); - updateMinSize(); - } - - private void buildLogic() - { - addMouseListener(new MouseAdapter() - { - - /* (non-Javadoc) - * @see org.fenggui.event.mouse.MouseAdapter#mousePressed(org.fenggui.event.mouse.MousePressedEvent) - */ - @Override - public void mousePressed(MousePressedEvent mousePressedEvent) - { - setSelected(!isSelected()); - } - - }); - - addKeyListener(new KeyAdapter() - { - public void keyPressed(KeyPressedEvent keyPressedEvent) - { - - if (keyPressedEvent.getKeyClass() == Key.ENTER || Character.isSpaceChar(keyPressedEvent.getKey())) - { - setSelected(!isSelected()); - } - } - }); - } - /** * * Creates a new <code>CheckBox</code> widget. @@ -109,14 +67,46 @@ public CheckBox(String text) { super(); - buildLogic(); getAppearance().setEnabled(STATE_SELECTED, false); getAppearance().setEnabled(STATE_DESELECTED, true); + setTraversable(true); setText(text); // does an updateMinSize() - setTraversable(true); } + + public CheckBox(CheckBox<E> checkBox) + { + super(checkBox); + } + /* (non-Javadoc) + * @see org.fenggui.ObservableWidget#keyTyped(org.fenggui.event.key.KeyTypedEvent) + */ + @Override + public void keyTyped(KeyTypedEvent keyTypedEvent) + { + if (keyTypedEvent.getKeyClass() == Key.ENTER || Character.isSpaceChar(keyTypedEvent.getKey())) + { + keyTypedEvent.setUsed(); + + setSelected(!isSelected()); + } + + super.keyTyped(keyTypedEvent); + } + + /* (non-Javadoc) + * @see org.fenggui.ObservableWidget#mouseClicked(org.fenggui.event.mouse.MouseClickedEvent) + */ + @Override + public void mouseClicked(MouseClickedEvent event) + { + event.setUsed(); + setSelected(!isSelected()); + + super.mouseClicked(event); + } + /** * Returns whether the check box is selected or not * @@ -222,4 +212,20 @@ setSelected(stream.processAttribute("selected", isSelected(), false)); } + /* (non-Javadoc) + * @see org.fenggui.ObservableLabelWidget#clone() + */ + @Override + public CheckBox<E> clone() throws CloneNotSupportedException + { + CheckBox<E> result = (CheckBox<E>) super.clone(); + + result.selectionChangedHook = new ArrayList<ISelectionChangedListener>(); + + result.getAppearance().setEnabled(STATE_SELECTED, false); + result.getAppearance().setEnabled(STATE_DESELECTED, true); + + return result; + } + } Modified: src/org/fenggui/Container.java =================================================================== --- src/org/fenggui/Container.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/Container.java 2009-03-25 22:02:20 UTC (rev 613) @@ -48,13 +48,14 @@ * @dedicated NOFX - Lazy * @see LayoutManager */ -public class Container extends StandardWidget implements IContainer +public class Container extends StandardWidget implements IContainer, Cloneable { - private LayoutManager layoutManager = null; - protected List<IWidget> notifyList = new CopyOnWriteArrayList<IWidget>(); - private boolean keyTraversalRoot = false; - private DefaultAppearance appearance = null; - private List<IWidgetListChangedListener> widgetListChangedHook = new ArrayList<IWidgetListChangedListener>(0); + private LayoutManager layoutManager = null; + protected List<IWidget> notifyList; + private boolean keyTraversalRoot = false; + private DefaultAppearance appearance = null; + private List<IWidgetListChangedListener> widgetListChangedHook; + private boolean minSizeUpdated = false; /** * Creates a new <code>Container</code>. @@ -67,6 +68,7 @@ public Container(LayoutManager layoutManager) { super(); + initContainer(); this.layoutManager = layoutManager; appearance = new DefaultAppearance(this); } @@ -80,10 +82,17 @@ { super(container); + initContainer(); this.layoutManager = container.layoutManager; this.appearance = new DefaultAppearance(this, container.appearance); } + private void initContainer() + { + this.notifyList = new CopyOnWriteArrayList<IWidget>(); + this.widgetListChangedHook = new ArrayList<IWidgetListChangedListener>(0); + } + public void addWidgetListChangedListener(IWidgetListChangedListener listener) { widgetListChangedHook.add(listener); @@ -277,6 +286,29 @@ widgetAdded(new WidgetListChangedEvent(this, c)); } + /* (non-Javadoc) + * @see org.fenggui.StandardWidget#updateMinSize() + */ + @Override + public void updateMinSize() + { + minSizeUpdated = false; + super.updateMinSize(); + + if (!minSizeUpdated) + this.layout(); + } + + /* (non-Javadoc) + * @see org.fenggui.Widget#minSizeChanged(org.fenggui.event.SizeChangedEvent) + */ + @Override + public void minSizeChanged(SizeChangedEvent event) + { + minSizeUpdated = true; + super.minSizeChanged(event); + } + /** * Adds a widget to the list. Doesn't refresh the minSize, call the added event or do * any layout of the container. @@ -870,4 +902,19 @@ { return notifyList.size() > 0; } + + /* (non-Javadoc) + * @see org.fenggui.Widget#clone() + */ + @Override + public Container clone() throws CloneNotSupportedException + { + Container result = (Container) super.clone(); + + result.initContainer(); + + result.appearance = this.appearance.clone(result); + + return result; + } } Modified: src/org/fenggui/DecoratorLayer.java =================================================================== --- src/org/fenggui/DecoratorLayer.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/DecoratorLayer.java 2009-03-25 22:02:20 UTC (rev 613) @@ -110,7 +110,7 @@ return GENERATE_NAME; } - public Object clone() throws CloneNotSupportedException + public DecoratorLayer clone() throws CloneNotSupportedException { DecoratorLayer result = (DecoratorLayer) super.clone(); Modified: src/org/fenggui/FengGUI.java =================================================================== --- src/org/fenggui/FengGUI.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/FengGUI.java 2009-03-25 22:02:20 UTC (rev 613) @@ -28,12 +28,12 @@ import org.fenggui.composite.menu.Menu; import org.fenggui.composite.menu.MenuBar; import org.fenggui.composite.menu.MenuItem; +import org.fenggui.theme.DefaultTheme; import org.fenggui.theme.ITheme; +import org.fenggui.theme.XMLTheme; import org.fenggui.util.Log; import org.fenggui.util.Util; -import com.sun.opengl.impl.Java2D; - /** * This class provides some basic information about FengGUI to applications. * @@ -78,8 +78,8 @@ createLabel(fake); createScrollContainer(fake); createTextEditor(fake); - createScrollBar(fake, true); - createScrollBar(fake, false); + createScrollBar(true); + createScrollBar(false); createCheckBox(); createRadioButton(fake, ""); } @@ -110,10 +110,11 @@ * @param widgetClass The class of the Widget to create a instance from. * @return a themed instance of a widget. */ + @SuppressWarnings("unchecked") public static <T extends IWidget> T createWidget(Class<T> widgetClass) { T widget = null; - boolean cloneableClass = widgetClass.isAssignableFrom(Cloneable.class); + boolean cloneableClass = Cloneable.class.isAssignableFrom(widgetClass); if (cloneableClass) { if (ptList == null) @@ -128,7 +129,7 @@ } catch (CloneNotSupportedException e) { - Log.error("Couldn't clone a Widget that implements the Clonable interface. %1", e, widgetClass + Log.error("Couldn't clone a Widget that implements the Clonable interface. %1$s", e, widgetClass .getSimpleName()); } } @@ -145,7 +146,7 @@ } catch (CloneNotSupportedException e) { - Log.error("Couldn't clone a Widget that implements the Clonable interface. %1", e, widgetClass.getSimpleName()); + Log.error("Couldn't clone a Widget that implements the Clonable interface. %1$s", e, widgetClass.getSimpleName()); } } @@ -336,6 +337,12 @@ return btn; } + @SuppressWarnings("unchecked") + public static <T> RadioButton<T> createRadioButton() + { + return (RadioButton<T>) FengGUI.createWidget(RadioButton.class); + } + /** * Creates a new radio button. * @param parent the parent container @@ -343,7 +350,6 @@ * @return the new radio button * @deprecated Use the generic {@link #createWidget(Class)} instead. */ - @SuppressWarnings("unchecked") public static <T> RadioButton<T> createRadioButton(IContainer parent, ToggableGroup<RadioButton<T>> group) { if (ptRadioButton == null) @@ -405,18 +411,11 @@ * * @param <T> * @return - * @deprecated Use the generic {@link #createWidget(Class)} instead. */ @SuppressWarnings("unchecked") public static <T> CheckBox<T> createCheckBox() { - if (ptCheckBox == null) - { - ptCheckBox = new CheckBox(); - FengGUI.setUpAppearance(ptCheckBox); - } - CheckBox<T> btn = new CheckBox<T>(ptCheckBox); - return btn; + return (CheckBox<T>) FengGUI.createWidget(CheckBox.class); } /** @@ -674,7 +673,6 @@ * @param maxBtn whether the window has a maximize button or not * @param minBtn whether the windows has a minimize button or not * @return new window - * @deprecated Use the generic {@link #createWidget(Class)} instead. */ public static Window createWindow(boolean closeBtn, boolean maxBtn, boolean minBtn, boolean autoclose) { @@ -861,30 +859,38 @@ * @param parent the parent container * @param horizontal whether the ScrollBar is horizontal or vertical * @return new ScrollBar - * @deprecated Use the generic {@link #createWidget(Class)} instead. */ - public static ScrollBar createScrollBar(IContainer parent, boolean horizontal) + public static ScrollBar createScrollBar(boolean horizontal) { ScrollBar c; - if (horizontal) + try { - if (ptScrollBarH == null) + if (horizontal) { - ptScrollBarH = new ScrollBar(horizontal); - FengGUI.setUpAppearance(ptScrollBarH); + if (ptScrollBarH == null) + { + ptScrollBarH = new ScrollBar(horizontal); + FengGUI.setUpAppearance(ptScrollBarH); + } + c = ptScrollBarH.clone(); } - c = new ScrollBar(ptScrollBarH); - } - else - { - if (ptScrollBarV == null) + else { - ptScrollBarV = new ScrollBar(horizontal); - FengGUI.setUpAppearance(ptScrollBarV); + if (ptScrollBarV == null) + { + ptScrollBarV = new ScrollBar(horizontal); + FengGUI.setUpAppearance(ptScrollBarV); + } + c = ptScrollBarV.clone(); } - c = new ScrollBar(ptScrollBarV); } - parent.addWidget(c); + catch (CloneNotSupportedException e) + { + Log.warn("Couldn't clone ScrollBar. Creating new one.", e); + c = new ScrollBar(horizontal); + FengGUI.setUpAppearance(c); + } + return c; } Modified: src/org/fenggui/Label.java =================================================================== --- src/org/fenggui/Label.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/Label.java 2009-03-25 22:02:20 UTC (rev 613) @@ -42,22 +42,14 @@ * 2007-11-28 11:16:38 +0100 (Mi, 28 Nov 2007) $ * @version $Revision$ */ -public class Label extends StandardWidget implements ILabel +public class Label extends StandardWidget implements ILabel, Cloneable { private Pixmap pixmap = null; private LabelAppearance appearance = null; private ITextContentManager textData = null; - protected ISizeChangedListener sizeChangedListener = new ISizeChangedListener() - { + protected ISizeChangedListener sizeChangedListener; - public void sizeChanged(SizeChangedEvent event) - { - updateMinSize(); - } - - }; - /** * Creates a new empty label * @@ -75,8 +67,7 @@ */ public Label(String text) { - textData = new TextContentManager(); - textData.addSizeChangedListener(sizeChangedListener); + initTextManager(); setAppearance(new LabelAppearance(this)); setText(text); } @@ -89,9 +80,8 @@ public Label(Label widget) { super(widget); - this.textData = new TextContentManager(); - this.textData.addSizeChangedListener(sizeChangedListener); - + initTextManager(); + this.pixmap = widget.pixmap; setAppearance(new LabelAppearance(this, widget.appearance)); } @@ -103,6 +93,22 @@ updateMinSize(); } + private void initTextManager() + { + sizeChangedListener = new ISizeChangedListener() + { + + public void sizeChanged(SizeChangedEvent event) + { + Label.this.updateMinSize(); + } + + }; + + textData = new TextContentManager(); + textData.addSizeChangedListener(sizeChangedListener); + } + @Override public LabelAppearance getAppearance() { @@ -261,4 +267,24 @@ { return textData; } + + /* (non-Javadoc) + * @see org.fenggui.Widget#clone() + */ + @Override + public Label clone() throws CloneNotSupportedException + { + Label result = (Label) super.clone(); + + //TODO: make text clonable + //result.textData = this.textData.clone(); + result.initTextManager(); + + result.appearance = new LabelAppearance(result, this.appearance); + + result.setText(this.getText()); + + updateMinSize(); + return result ; + } } Modified: src/org/fenggui/ModelWidget.java =================================================================== --- src/org/fenggui/ModelWidget.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/ModelWidget.java 2009-03-25 22:02:20 UTC (rev 613) @@ -112,4 +112,18 @@ ModelUpdated(model, false); } + /* (non-Javadoc) + * @see org.fenggui.StatefullWidget#clone() + */ + @SuppressWarnings("unchecked") + @Override + public ModelWidget<T, M> clone() throws CloneNotSupportedException + { + ModelWidget<T, M> result = (ModelWidget<T, M>) super.clone(); + + this.model = null; + + return result; + } + } Modified: src/org/fenggui/ObservableLabelWidget.java =================================================================== --- src/org/fenggui/ObservableLabelWidget.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/ObservableLabelWidget.java 2009-03-25 22:02:20 UTC (rev 613) @@ -43,27 +43,20 @@ * 11:16:38 +0100 (Mi, 28 Nov 2007) $ * @version $Revision$ */ -public class ObservableLabelWidget extends StatefullWidget<LabelAppearance> implements ILabel +public class ObservableLabelWidget extends StatefullWidget<LabelAppearance> implements ILabel, Cloneable { private Pixmap pixmap = null; - private ITextContentManager textData = null; + private ITextContentManager textData; - protected ISizeChangedListener sizeChangedListener = new ISizeChangedListener() - { + private ISizeChangedListener sizeChangedListener; - public void sizeChanged(SizeChangedEvent event) - { - updateMinSize(); - } - - }; - public ObservableLabelWidget() { super(); - textData = new TextContentManager(); - textData.addSizeChangedListener(sizeChangedListener); + initTextData(); this.setAppearance(new LabelAppearance(this)); + + updateMinSize(); } /** @@ -75,17 +68,34 @@ { super(widget); - textData = new TextContentManager(); - textData.addSizeChangedListener(sizeChangedListener); - + initTextData(); + if (widget != null) { this.pixmap = widget.getPixmap(); this.setAppearance(new LabelAppearance(this, widget.getAppearance())); textData.setContent(widget.textData.getContent(), getAppearance()); } + + updateMinSize(); } + private void initTextData() { + sizeChangedListener = new ISizeChangedListener() + { + + public void sizeChanged(SizeChangedEvent event) + { + ObservableLabelWidget.this.updateMinSize(); + } + + }; + + textData = new TextContentManager(); + textData.setContent("", getAppearance()); + textData.addSizeChangedListener(this.sizeChangedListener); + } + /* * (non-Javadoc) * @@ -267,4 +277,25 @@ { return textData; } + + /* (non-Javadoc) + * @see org.fenggui.StatefullWidget#clone() + */ + @Override + public ObservableLabelWidget clone() throws CloneNotSupportedException + { + ObservableLabelWidget result = (ObservableLabelWidget) super.clone(); + + LabelAppearance app = this.getAppearance().clone(result); + + result.setAppearance(app); + + //TODO: make text data clonable as well + //result.textData = this.textData.clone(); + result.initTextData(); + + result.setText(this.getText()); + + return result; + } } Modified: src/org/fenggui/ObservableWidget.java =================================================================== --- src/org/fenggui/ObservableWidget.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/ObservableWidget.java 2009-03-25 22:02:20 UTC (rev 613) @@ -18,12 +18,41 @@ */ package org.fenggui; -import org.fenggui.event.*; -import org.fenggui.event.key.*; -import org.fenggui.event.mouse.*; - import java.util.ArrayList; +import org.fenggui.event.ActivationEvent; +import org.fenggui.event.Event; +import org.fenggui.event.FocusEvent; +import org.fenggui.event.IActivationListener; +import org.fenggui.event.IEventListener; +import org.fenggui.event.IFocusListener; +import org.fenggui.event.key.IKeyListener; +import org.fenggui.event.key.IKeyPressedListener; +import org.fenggui.event.key.IKeyReleasedListener; +import org.fenggui.event.key.IKeyTypedListener; +import org.fenggui.event.key.Key; +import org.fenggui.event.key.KeyAdapter; +import org.fenggui.event.key.KeyPressedEvent; +import org.fenggui.event.key.KeyReleasedEvent; +import org.fenggui.event.key.KeyTypedEvent; +import org.fenggui.event.mouse.IMouseDraggedListener; +import org.fenggui.event.mouse.IMouseEnteredListener; +import org.fenggui.event.mouse.IMouseExitedListener; +import org.fenggui.event.mouse.IMouseListener; +import org.fenggui.event.mouse.IMouseMovedListener; +import org.fenggui.event.mouse.IMousePressedListener; +import org.fenggui.event.mouse.IMouseReleasedListener; +import org.fenggui.event.mouse.IMouseWheelListener; +import org.fenggui.event.mouse.MouseClickedEvent; +import org.fenggui.event.mouse.MouseDoubleClickedEvent; +import org.fenggui.event.mouse.MouseDraggedEvent; +import org.fenggui.event.mouse.MouseEnteredEvent; +import org.fenggui.event.mouse.MouseExitedEvent; +import org.fenggui.event.mouse.MouseMovedEvent; +import org.fenggui.event.mouse.MousePressedEvent; +import org.fenggui.event.mouse.MouseReleasedEvent; +import org.fenggui.event.mouse.MouseWheelEvent; + /** * Widget that travels between states. * <p/> @@ -54,41 +83,14 @@ public ObservableWidget() { super(); - hookEvents(); } public ObservableWidget(ObservableWidget widget) { super(widget); - hookEvents(); + this.enabled = widget.enabled; } - private void hookEvents() - { - this.addMouseListener(new MouseAdapter() - { - - /* (non-Javadoc) - * @see org.fenggui.event.mouse.MouseAdapter#mousePressed(org.fenggui.event.mouse.MousePressedEvent) - */ - @Override - public void mousePressed(MousePressedEvent mousePressedEvent) - { - mousePressedOnWidget = true; - } - - /* (non-Javadoc) - * @see org.fenggui.event.mouse.MouseAdapter#mouseReleased(org.fenggui.event.mouse.MouseReleasedEvent) - */ - @Override - public void mouseReleased(MouseReleasedEvent mouseReleasedEvent) - { - mousePressedOnWidget = false; - } - - }); - } - public boolean isEnabled() { return enabled; @@ -168,14 +170,20 @@ this.enabled = enabled; - ActivationEvent e = new ActivationEvent(this, enabled); + this.activated(new ActivationEvent(this, enabled)); + } + public void activated(ActivationEvent e) + { + if (!isVisible() || !isInWidgetTree()) + return; + for (IActivationListener l : activationHook) { l.widgetActivationChanged(e); } } - + private ArrayList<IActivationListener> activationHook = new ArrayList<IActivationListener>(0); private ArrayList<IMouseEnteredListener> mouseEnteredHook = new ArrayList<IMouseEnteredListener>(0); private ArrayList<IMouseMovedListener> mouseMovedHook = new ArrayList<IMouseMovedListener>(0); @@ -388,6 +396,8 @@ if (!enabled || !isVisible() || !isInWidgetTree()) return; + mousePressedOnWidget = true; + for (IMousePressedListener l : mousePressedHook) { l.mousePressed(mousePressedEvent); @@ -477,6 +487,8 @@ if (!enabled || !isVisible() || !isInWidgetTree()) return; + mousePressedOnWidget = false; + for (IMouseReleasedListener l : mouseReleasedHook) { l.mouseReleased(mouseReleasedEvent); @@ -651,4 +663,37 @@ } } } + + /* (non-Javadoc) + * @see org.fenggui.Widget#clone() + */ + @Override + public ObservableWidget clone() throws CloneNotSupportedException + { + ObservableWidget result = (ObservableWidget) super.clone(); + + result.activationHook = new ArrayList<IActivationListener>(0); + result.mouseEnteredHook = new ArrayList<IMouseEnteredListener>(0); + result.mouseMovedHook = new ArrayList<IMouseMovedListener>(0); + result.mouseExitedHook = new ArrayList<IMouseExitedListener>(0); + result.mousePressedHook = new ArrayList<IMousePressedListener>(0); + result.mouseReleasedHook = new ArrayList<IMouseReleasedListener>(0); + result.focusGainedHook = new ArrayList<IFocusListener>(0); + result.mouseDraggedHook = new ArrayList<IMouseDraggedListener>(0); + result.mouseWheeledHook = new ArrayList<IMouseWheelListener>(0); + result.keyPressedHook = new ArrayList<IKeyPressedListener>(0); + result.keyReleasedHook = new ArrayList<IKeyReleasedListener>(0); + result.keyTypedHook = new ArrayList<IKeyTypedListener>(0); + result.mouseHook = new ArrayList<IMouseListener>(0); + result.keyHook = new ArrayList<IKeyListener>(0); + + result.globalListener = null; + result.keyTraversalListener = null; + result.setTraversable(this.isTraversable()); + result.previousWidget = null; + result.nextWidget = null; + result.mousePressedOnWidget = false; + + return result; + } } Modified: src/org/fenggui/RadioButton.java =================================================================== --- src/org/fenggui/RadioButton.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/RadioButton.java 2009-03-25 22:02:20 UTC (rev 613) @@ -181,4 +181,19 @@ { selectionChangedHook.add(l); } + + /* (non-Javadoc) + * @see org.fenggui.ObservableLabelWidget#clone() + */ + @Override + public RadioButton<E> clone() throws CloneNotSupportedException + { + RadioButton<E> result = (RadioButton<E>) super.clone(); + result.value = null; + result.selectionChangedHook = new ArrayList<ISelectionChangedListener>(); + result.radioButtonGroup = null; + + return result; + } + } Modified: src/org/fenggui/ScrollBar.java =================================================================== --- src/org/fenggui/ScrollBar.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/ScrollBar.java 2009-03-25 22:02:20 UTC (rev 613) @@ -43,7 +43,7 @@ * 2007-11-19 14:53:14 +0100 (Mo, 19 Nov 2007) $ * @version $Revision$ */ -public class ScrollBar extends StandardWidget implements IBasicContainer +public class ScrollBar extends StandardWidget implements IBasicContainer, Cloneable { public static final String LABEL_DEFAULT = "default"; @@ -92,14 +92,12 @@ this.horizontal = widget.horizontal; this.buttonJump = widget.buttonJump; + this.appearance = new DefaultAppearance(this, widget.appearance); slider = new Slider(widget.slider); increaseBtn = new Button(widget.increaseBtn); decreaseBtn = new Button(widget.decreaseBtn); setupElements(); - this.appearance = new DefaultAppearance(this, widget.appearance); - - getAppearance().setEnabled(LABEL_DISABLED, false); updateMinSize(); } @@ -113,13 +111,11 @@ public ScrollBar(boolean horizontal) { this.horizontal = horizontal; + appearance = new DefaultAppearance(this); createElements(horizontal); setupElements(); - appearance = new DefaultAppearance(this); - - getAppearance().setEnabled(LABEL_DISABLED, false); updateMinSize(); } @@ -132,6 +128,8 @@ private void setupElements() { + appearance.setEnabled(LABEL_DISABLED, false); + slider.setParent(this); increaseBtn.setParent(this); decreaseBtn.setParent(this); @@ -386,4 +384,22 @@ { return false; } + + /* (non-Javadoc) + * @see org.fenggui.Widget#clone() + */ + @Override + public ScrollBar clone() throws CloneNotSupportedException + { + ScrollBar result = (ScrollBar) super.clone(); + + result.slider = this.slider.clone(); + result.increaseBtn = this.increaseBtn.clone(); + result.decreaseBtn = this.decreaseBtn.clone(); + result.appearance = this.appearance.clone(result); + + result.setupElements(); + + return result; + } } Modified: src/org/fenggui/ScrollContainer.java =================================================================== --- src/org/fenggui/ScrollContainer.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/ScrollContainer.java 2009-03-25 22:02:20 UTC (rev 613) @@ -56,7 +56,7 @@ * @dedication Monkey Island 3 Theme - Using the Row Boat * (http://www.scummbar.com/mi2/MI3-CD1/35%20-%20Using%20the%20Row%20Boat.mp3) */ -public class ScrollContainer extends StandardWidget implements IContainer +public class ScrollContainer extends StandardWidget implements IContainer, Cloneable { /** * The boolean flag indicates if the vertical bar should be placed on the left side of @@ -961,4 +961,27 @@ return this.innerWidget != null; } + /* (non-Javadoc) + * @see org.fenggui.Widget#clone() + */ + @Override + public ScrollContainer clone() throws CloneNotSupportedException + { + ScrollContainer result = (ScrollContainer) super.clone(); + + result.appearance = new DefaultAppearance(this, this.appearance); + + result.horizontalScrollBar = this.horizontalScrollBar.clone(); + result.verticalScrollBar = this.verticalScrollBar.clone(); + + verticalScrollBar.getSlider().setValue(0); + horizontalScrollBar.getSlider().setValue(0); + + innerWidget = null; + + buildEvents(); + + return result; + } + } Modified: src/org/fenggui/Slider.java =================================================================== --- src/org/fenggui/Slider.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/Slider.java 2009-03-25 22:02:20 UTC (rev 613) @@ -26,7 +26,6 @@ import org.fenggui.binding.render.Graphics; import org.fenggui.binding.render.IOpenGL; import org.fenggui.event.ActivationEvent; -import org.fenggui.event.IActivationListener; import org.fenggui.event.IDragAndDropListener; import org.fenggui.event.ISliderMovedListener; import org.fenggui.event.SliderMovedEvent; @@ -49,7 +48,7 @@ * @author Johannes Schaback * @dedication The Beatles - Sgt. Peppers Lonely Hearts Club Band */ -public class Slider extends StatefullWidget<DefaultAppearance> implements IBasicContainer +public class Slider extends StatefullWidget<DefaultAppearance> implements IBasicContainer, Cloneable { private ArrayList<ISliderMovedListener> sliderMovedHook = new ArrayList<ISliderMovedListener>(); @@ -94,7 +93,6 @@ setTraversable(true); - buildListeners(); updateMinSize(); } @@ -112,7 +110,6 @@ this.setAppearance(new DefaultAppearance(this, slider.getAppearance())); setTraversable(true); - buildListeners(); updateMinSize(); } @@ -120,7 +117,7 @@ { process(stream); } - + /** * Returns the selected value according to the position of * the slider in a range between 0 and 1. For horizontal Sliders, @@ -166,33 +163,33 @@ return sliderButton; } - private void buildListeners() + + /* (non-Javadoc) + * @see org.fenggui.ObservableWidget#activated(org.fenggui.event.ActivationEvent) + */ + @Override + public void activated(ActivationEvent activationEvent) { - addActivationListener(new IActivationListener() + boolean enabled = activationEvent.isEnabled(); + + sliderButton.setEnabled(enabled); + + if (enabled) { - - public void widgetActivationChanged(ActivationEvent activationEvent) + if (getDisplay() != null) { - boolean enabled = activationEvent.isEnabled(); - - sliderButton.setEnabled(enabled); - - if (enabled) - { - if (getDisplay() != null) - { - getDisplay().addDndListener(dndListener); - } - } - else - { - if (getDisplay() != null) - { - getDisplay().removeDndListener(dndListener); - } - } + getDisplay().addDndListener(dndListener); } - }); + } + else + { + if (getDisplay() != null) + { + getDisplay().removeDndListener(dndListener); + } + } + + super.activated(activationEvent); } /* @@ -299,6 +296,10 @@ { if (getDisplay() != null && isEnabled()) getDisplay().addDndListener(dndListener); + + sliderButton.addedToWidgetTree(); + + super.addedToWidgetTree(); } @Override @@ -306,6 +307,10 @@ { if (getDisplay() != null) getDisplay().removeDndListener(dndListener); + + sliderButton.removedFromWidgetTree(); + + super.removedFromWidgetTree(); } /** @@ -544,4 +549,20 @@ return false; } + /* (non-Javadoc) + * @see org.fenggui.StatefullWidget#clone() + */ + @Override + public Slider clone() throws CloneNotSupportedException + { + Slider result = (Slider) super.clone(); + + result.sliderButton = this.sliderButton.clone(); + result.sliderButton.setParent(result); + + result.setAppearance(this.getAppearance().clone(result)); + + return result; + } + } Modified: src/org/fenggui/StatefullWidget.java =================================================================== --- src/org/fenggui/StatefullWidget.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/StatefullWidget.java 2009-03-25 22:02:20 UTC (rev 613) @@ -56,6 +56,7 @@ */ public StatefullWidget() { + super(); } /** @@ -64,6 +65,10 @@ public StatefullWidget(StatefullWidget<T> widget) { super(widget); + + this.hovered = widget.hovered; + this.error = widget.error; + this.defaultHoverCursorType = widget.defaultHoverCursorType; } /* (non-Javadoc) @@ -266,4 +271,16 @@ this.error = error; updateState(); } + + /* (non-Javadoc) + * @see org.fenggui.ObservableWidget#clone() + */ + @Override + public StatefullWidget<T> clone() throws CloneNotSupportedException + { + StatefullWidget<T> result = (StatefullWidget<T>) super.clone(); + + + return result; + } } Modified: src/org/fenggui/Widget.java =================================================================== --- src/org/fenggui/Widget.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/Widget.java 2009-03-25 22:02:20 UTC (rev 613) @@ -58,36 +58,36 @@ public class Widget implements IWidget { - private Dimension size = new Dimension(10, 10); - private Dimension minSize = new Dimension(10, 10); + private Dimension size; + private Dimension minSize; - private boolean shrinkable = true; - private boolean expandable = true; - private boolean visible = true; - private Object data = null; + private boolean shrinkable; + private boolean expandable; + private boolean visible; + private Object data = null; - private ITooltipData tooltip = null; + private ITooltipData tooltip = null; - private ArrayList<ISizeChangedListener> sizeHook = new ArrayList<ISizeChangedListener>(0); - private ArrayList<ISizeChangedListener> minSizeHook = new ArrayList<ISizeChangedListener>(0); - private ArrayList<IPositionChangedListener> positionHook = new ArrayList<IPositionChangedListener>(0); + private ArrayList<ISizeChangedListener> sizeHook; + private ArrayList<ISizeChangedListener> minSizeHook; + private ArrayList<IPositionChangedListener> positionHook; /** * The parent Container in which the Widget lays. */ - private IBasicContainer parent = null; + private IBasicContainer parent = null; /** * Position of the Widget in the coordinate system of the parent * Container. */ - private Point position = new Point(0, 0); + private Point position; /** * Layout Data that is associated with this Widget. Layout data is * required by the layout managers to know how to layout a Widget. */ - private ILayoutData layoutData = null; + private ILayoutData layoutData = null; /** * Creates a new widget. @@ -95,6 +95,17 @@ */ public Widget() { + position = new Point(0,0); + size = new Dimension(10, 10); + minSize = new Dimension(10, 10); + shrinkable = true; + expandable = true; + visible = true; + data = null; + parent = null; + layoutData = null; + + initHooks(); } /** @@ -107,6 +118,7 @@ this(); if (widget != null) { + this.position = new Point(widget.position); this.size = new Dimension(widget.size); this.minSize = new Dimension(widget.minSize); this.shrinkable = widget.shrinkable; @@ -114,9 +126,22 @@ this.visible = widget.visible; // TODO: copy this object aswell // this.layoutData = widget.layoutData + + data = null; + parent = null; + layoutData = null; + + initHooks(); } } + private void initHooks() + { + sizeHook = new ArrayList<ISizeChangedListener>(0); + minSizeHook = new ArrayList<ISizeChangedListener>(0); + positionHook = new ArrayList<IPositionChangedListener>(0); + } + /** * Sets the LayoutData of this Widget. Note that the parameter is not * type safe. If you pass a wrong type, the LayoutManager may crash @@ -806,17 +831,27 @@ { //do nothing } - - public Object clone() throws CloneNotSupportedException + + /** + * This will create a copy of the widget. This copy will be deep. The only restriction + * is that it will not copy any content Items or child Widgets of this widget. + */ + @Override + public Widget clone() throws CloneNotSupportedException { Widget result = (Widget) super.clone(); + + result.position = this.position.clone(); + result.size = this.size.clone(); + result.minSize = this.minSize.clone(); + + result.data = null; + result.tooltip = null; + result.parent = null; + result.layoutData = null; - result.size = new Dimension(this.size); - result.minSize = new Dimension(this.minSize); - result.shrinkable = this.shrinkable; - result.expandable = this.expandable; - result.visible = this.visible; - + result.initHooks(); + return result; } } Deleted: src/org/fenggui/appearance/ContainerEntryAppearance.java =================================================================== --- src/org/fenggui/appearance/ContainerEntryAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/ContainerEntryAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -1,43 +0,0 @@ -/* - * FengGUI - Java GUIs in OpenGL (http://www.fenggui.org) - * - * Copyright (c) 2005-2009 FengGUI Project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details: - * http://www.gnu.org/copyleft/lesser.html#TOC3 - * - * Created on 22.10.2007 - * $Id$ - */ -package org.fenggui.appearance; - -import org.fenggui.StandardWidget; - -/** - * - * @author marcmenghin, last edited by $Author$, $Date$ - * @version $Revision$ - */ -public class ContainerEntryAppearance extends EntryAppearance -{ - // private Pixmap minusIcon; - // private Pixmap plusIcon; - - public static final int ICON_OFFSET = 15; - public static final int OFFSET = 15; - - public ContainerEntryAppearance(StandardWidget w) - { - super(w); - // TODO Auto-generated constructor stub - } - -} Modified: src/org/fenggui/appearance/DecoratorAppearance.java =================================================================== --- src/org/fenggui/appearance/DecoratorAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/DecoratorAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -57,8 +57,7 @@ public DecoratorAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException { - super(w); - this.process(stream); + super(w, stream); } public DecoratorAppearance(StandardWidget w, DecoratorAppearance appearance) @@ -311,4 +310,40 @@ } + /* (non-Javadoc) + * @see org.fenggui.appearance.SpacingAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + protected DecoratorAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + DecoratorAppearance result = (DecoratorAppearance) super.clone(widget); + + result.backgroundDecorators = new ArrayList<IDecorator>(this.backgroundDecorators.size()); + result.foregroundDecorators = new ArrayList<IDecorator>(this.foregroundDecorators.size()); + result.switches = new ArrayList<Switch>(this.switches.size()); + + for (IDecorator decorator : this.backgroundDecorators) + { + IDecorator copy = decorator.copy(); + if (copy != null) + result.backgroundDecorators.add(copy); + } + + for (IDecorator decorator : this.foregroundDecorators) + { + IDecorator copy = decorator.copy(); + if (copy != null) + result.foregroundDecorators.add(copy); + } + + for (Switch s : this.switches) + { + Switch copy = s.copy(); + if (copy != null) + result.switches.add(copy); + } + + return result; + } + } Modified: src/org/fenggui/appearance/DefaultAppearance.java =================================================================== --- src/org/fenggui/appearance/DefaultAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/DefaultAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -22,6 +22,7 @@ import org.fenggui.StandardWidget; import org.fenggui.theme.xml.IXMLStreamableException; +import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; /** @@ -30,7 +31,7 @@ * @author marcmenghin, last edited by $Author$, $Date$ * @version $Revision$ */ -public class DefaultAppearance extends GenericAppearance +public class DefaultAppearance extends GenericAppearance implements Cloneable { public DefaultAppearance(StandardWidget w) @@ -43,9 +44,23 @@ super(w, appearance); } + public DefaultAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException + { + super(w, stream); + } + @Override public void process(InputOutputStream stream) throws IOException, IXMLStreamableException { super.process(stream); } + + /* (non-Javadoc) + * @see org.fenggui.appearance.GenericAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + public DefaultAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + return (DefaultAppearance) super.clone(widget); + } } Modified: src/org/fenggui/appearance/DummyAppearance.java =================================================================== --- src/org/fenggui/appearance/DummyAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/DummyAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -23,7 +23,7 @@ import org.fenggui.binding.render.IOpenGL; import org.fenggui.util.Dimension; -public class DummyAppearance implements IAppearance +public class DummyAppearance implements IAppearance, Cloneable { public Dimension getMinSizeHint() @@ -36,4 +36,13 @@ // do nothing } + /* (non-Javadoc) + * @see java.lang.Object#clone() + */ + @Override + public DummyAppearance clone() throws CloneNotSupportedException + { + return (DummyAppearance) super.clone(); + } + } Modified: src/org/fenggui/appearance/EntryAppearance.java =================================================================== --- src/org/fenggui/appearance/EntryAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/EntryAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -48,7 +48,6 @@ public EntryAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException { super(w, stream); - this.process(stream); } public EntryAppearance(StandardWidget w) @@ -148,4 +147,21 @@ { this.color = color; } + + /* (non-Javadoc) + * @see org.fenggui.appearance.LabelAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + public LabelAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + EntryAppearance result = (EntryAppearance) super.clone(widget); + + result.hoverColor = this.hoverColor.clone(); + result.selectionColor = this.selectionColor.clone(); + result.color = this.color.clone(); + result.selectionUnderlay = this.getSelectionUnderlay().clone(); + result.mouseHoverUnderlay = this.getHoverUnderlay().clone(); + + return result; + } } Modified: src/org/fenggui/appearance/GenericAppearance.java =================================================================== --- src/org/fenggui/appearance/GenericAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/GenericAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -22,14 +22,16 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import org.fenggui.StandardWidget; import org.fenggui.binding.render.Pixmap; -import org.fenggui.decorator.Decorator; +import org.fenggui.decorator.IDecorator; import org.fenggui.theme.xml.IXMLStreamable; import org.fenggui.theme.xml.IXMLStreamableException; import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; +import org.fenggui.util.Alignment; import org.fenggui.util.Color; import org.fenggui.util.Spacing; @@ -45,7 +47,8 @@ private Map<String, Color> colors = null; private Map<String, IntegerStore> integers = null; private Map<String, Spacing> spacings = null; - private Map<String, Decorator> decorators = null; + private Map<String, IDecorator> decorators = null; + private Map<String, Alignment> alignments = null; /** * Internal Class to store integer values as XML elements @@ -77,6 +80,17 @@ { stream.processAttribute("Value", value); } + + /* (non-Javadoc) + * @see java.lang.Object#clone() + */ + @Override + public IntegerStore clone() throws CloneNotSupportedException + { + IntegerStore result = (IntegerStore) super.clone(); + result.value = new Integer(this.value.intValue()); + return result; + } } /** @@ -117,13 +131,15 @@ colors = new HashMap<String, Color>(); integers = new HashMap<String, IntegerStore>(); spacings = new HashMap<String, Spacing>(); - decorators = new HashMap<String, Decorator>(); - + decorators = new HashMap<String, IDecorator>(); + alignments = new HashMap<String, Alignment>(); + stream.processChildren("Pixmap", pixmaps, Pixmap.class); stream.processChildren("Color", colors, Color.class); stream.processChildren("Integer", integers, IntegerStore.class); stream.processChildren("Spacing", spacings, Spacing.class); - stream.processChildren("Decorator", decorators, Decorator.class); + stream.processChildren("Decorator", decorators, IDecorator.class); + stream.processEnumChildren("Alignment", alignments, Alignment.class); } public Pixmap getPixmap(String key) @@ -198,7 +214,7 @@ spacings.put(key, spacing); } - public Decorator getDecorator(String key) + public IDecorator getDecorator(String key) { if (decorators != null) return decorators.get(key); @@ -206,13 +222,83 @@ return null; } - public void addDecorator(String key, Decorator decorator) + public void addDecorator(String key, IDecorator decorator) { if (decorators == null) - decorators = new HashMap<String, Decorator>(); + decorators = new HashMap<String, IDecorator>(); decorators.remove(key); decorators.put(key, decorator); } + public Alignment getAlignment(String key) + { + if (alignments != null) + return alignments.get(key); + else + return null; + } + + public void addAlignment(String key, Alignment decorator) + { + if (alignments == null) + alignments = new HashMap<String, Alignment>(); + + alignments.remove(key); + alignments.put(key, decorator); + } + + /* (non-Javadoc) + * @see org.fenggui.appearance.DecoratorAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + protected DecoratorAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + GenericAppearance result = (GenericAppearance) super.clone(widget); + + if (this.alignments != null) + { + result.alignments = new HashMap<String, Alignment>(this.alignments.size()); + for (Entry<String, Alignment> align : this.alignments.entrySet()) + result.alignments.put(align.getKey(), align.getValue()); + } + + if (this.decorators != null) + { + result.decorators = new HashMap<String, IDecorator>(this.decorators.size()); + for (Entry<String, IDecorator> align : this.decorators.entrySet()) + result.decorators.put(align.getKey(), align.getValue().copy()); + } + + if (this.spacings != null) + { + result.spacings = new HashMap<String, Spacing>(this.spacings.size()); + for (Entry<String, Spacing> align : this.spacings.entrySet()) + result.spacings.put(align.getKey(), align.getValue().clone()); + } + + if (this.colors != null) + { + result.colors = new HashMap<String, Color>(this.colors.size()); + for (Entry<String, Color> align : this.colors.entrySet()) + result.colors.put(align.getKey(), align.getValue().clone()); + } + + if (this.integers != null) + { + result.integers = new HashMap<String, IntegerStore>(this.integers.size()); + for (Entry<String, IntegerStore> align : this.integers.entrySet()) + result.integers.put(align.getKey(), align.getValue().clone()); + } + + if (this.pixmaps != null) + { + result.pixmaps = new HashMap<String, Pixmap>(this.pixmaps.size()); + for (Entry<String, Pixmap> align : this.pixmaps.entrySet()) + result.pixmaps.put(align.getKey(), align.getValue()); + } + + return result; + } + } \ No newline at end of file Modified: src/org/fenggui/appearance/LabelAppearance.java =================================================================== --- src/org/fenggui/appearance/LabelAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/LabelAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -45,8 +45,7 @@ public LabelAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException { - this(w); - this.process(stream); + super(w, stream); } public LabelAppearance(StandardWidget w, LabelAppearance appearance) @@ -75,4 +74,13 @@ } + /* (non-Javadoc) + * @see org.fenggui.appearance.TextAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + public LabelAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + return (LabelAppearance) super.clone(widget); + } + } Modified: src/org/fenggui/appearance/SpacingAppearance.java =================================================================== --- src/org/fenggui/appearance/SpacingAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/SpacingAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -25,6 +25,7 @@ import org.fenggui.binding.render.IOpenGL; import org.fenggui.theme.xml.IXMLStreamable; import org.fenggui.theme.xml.IXMLStreamableException; +import org.fenggui.theme.xml.InputOnlyStream; import org.fenggui.theme.xml.InputOutputStream; import org.fenggui.util.Dimension; import org.fenggui.util.Spacing; @@ -96,6 +97,12 @@ this.padding = new Spacing(appearance.padding); } + public SpacingAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException + { + widget = w; + this.process(stream); + } + /** * Returns the space reserved for borders. * @return the border spacing @@ -325,4 +332,18 @@ { return GENERATE_NAME; } + + /* (non-Javadoc) + * @see java.lang.Object#clone() + */ + protected SpacingAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + SpacingAppearance result = (SpacingAppearance) super.clone(); + result.border = this.border.clone(); + result.margin = this.margin.clone(); + result.padding = this.padding.clone(); + result.widget = widget; + + return result; + } } Modified: src/org/fenggui/appearance/TextAppearance.java =================================================================== --- src/org/fenggui/appearance/TextAppearance.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/appearance/TextAppearance.java 2009-03-25 22:02:20 UTC (rev 613) @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import java.util.MissingResourceException; +import java.util.Map.Entry; import org.fenggui.StandardWidget; import org.fenggui.binding.render.text.ITextRenderer; @@ -59,9 +60,7 @@ public TextAppearance(StandardWidget w, InputOnlyStream stream) throws IOException, IXMLStreamableException { - super(w); - setupDefaults(); - this.process(stream); + super(w, stream); } public TextAppearance(StandardWidget w) @@ -95,6 +94,8 @@ { super.process(stream); + setupDefaults(); + alignment = stream.processEnum("alignment", alignment, Alignment.MIDDLE, Alignment.class, Alignment.STORAGE_FORMAT); renderers.clear(); @@ -181,4 +182,27 @@ { this.alignment = alignment; } + + /* (non-Javadoc) + * @see org.fenggui.appearance.DefaultAppearance#clone(org.fenggui.StandardWidget) + */ + @Override + public TextAppearance clone(StandardWidget widget) throws CloneNotSupportedException + { + TextAppearance result = (TextAppearance) super.clone(widget); + + result.renderers = new HashMap<String, ITextRenderer>(this.renderers.size()); + result.styles = new HashMap<String, TextStyle>(this.styles.size()); + + //Renderers should be fixed objects, for new renderer a new object needs to be created + result.renderers.putAll(this.renderers); + + for (Entry<String, TextStyle> style: this.styles.entrySet()) + { + result.styles.put(style.getKey(), style.getValue().clone()); + } + + return result; + } + } Modified: src/org/fenggui/text/content/factory/simple/TextStyle.java =================================================================== --- src/org/fenggui/text/content/factory/simple/TextStyle.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/text/content/factory/simple/TextStyle.java 2009-03-25 22:02:20 UTC (rev 613) @@ -103,13 +103,14 @@ stream.processChildren("Style", styles, TextStyleEntry.class); } - public Object clone() throws CloneNotSupportedException + @Override + public TextStyle clone() throws CloneNotSupportedException { TextStyle result = (TextStyle) super.clone(); for (Entry<String, TextStyleEntry> entry: this.styles.entrySet()) { - result.styles.put(entry.getKey(), (TextStyleEntry) entry.getValue().clone()); + result.styles.put(entry.getKey(), entry.getValue().clone()); } return result; Modified: src/org/fenggui/text/content/factory/simple/TextStyleEntry.java =================================================================== --- src/org/fenggui/text/content/factory/simple/TextStyleEntry.java 2009-03-25 14:20:22 UTC (rev 612) +++ src/org/fenggui/text/content/factory/simple/TextStyleEntry.java 2009-03-25 22:02:20 UTC (rev 613) @@ -145,16 +145,15 @@ return appearance.getRenderer(this.fontStyle); } - public Object clone() throws CloneNotSupportedException + @Override + public TextStyleEntry clone() throws CloneNotSupportedException { TextStyleEntry result = (TextStyleEntry) super.clone(); - result.fontStyle = this.fontStyle; - result.color = this.color; - result.selectionColor = this.selectionColor; - result.mouseCursor = this.mouseCursor; - result.background = (DecoratorLayer) this.background.clone(); - result.selectionBackground = (DecoratorLayer) this.selectionBackground.clone(); + result.color = this.color.clone(); + result.selectionColor = this.selectionColor.clone(); + result.background = this.background.clone(); + result.selectionBackground = th... [truncated message content] |
From: <mar...@us...> - 2009-03-25 14:20:30
|
Revision: 612 http://fenggui.svn.sourceforge.net/fenggui/?rev=612&view=rev Author: marcmenghin Date: 2009-03-25 14:20:22 +0000 (Wed, 25 Mar 2009) Log Message: ----------- - fix compatibility problem with String.isEmpty() which is not in java 1.5. Modified Paths: -------------- optional/org/fenggui/composite/filedialog/FileChooserDialog.java Modified: optional/org/fenggui/composite/filedialog/FileChooserDialog.java =================================================================== --- optional/org/fenggui/composite/filedialog/FileChooserDialog.java 2009-03-22 15:58:20 UTC (rev 611) +++ optional/org/fenggui/composite/filedialog/FileChooserDialog.java 2009-03-25 14:20:22 UTC (rev 612) @@ -1325,7 +1325,7 @@ { super(); name = FileSystemView.getFileSystemView().getSystemDisplayName(file); - if (name.isEmpty()) + if (name.length() <= 0) name = file.toString(); this.file = file; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2009-03-22 15:58:31
|
Revision: 611 http://fenggui.svn.sourceforge.net/fenggui/?rev=611&view=rev Author: marcmenghin Date: 2009-03-22 15:58:20 +0000 (Sun, 22 Mar 2009) Log Message: ----------- - added generic createWidget method to FengGUI factory. - depreciated all old create[WidgetName] methods as the generic one should be used instead. - changed wrong method name in Item from getUserData to getData - added initial version of a FileChooserDialog (thx sbayless for the code) - TextStyle and TextStyleEntry are now Cloneable - some additional improvements to the DefaultTheme - added replaceable Logging system (hopefully soon all the System.out.println(..) are gone) - added a FileDialogExample for the new FileChooserDialog Modified Paths: -------------- optional/org/fenggui/FengGUIOptional.java optional/org/fenggui/composite/GUIInspector.java optional/org/fenggui/composite/tree/Tree.java src/org/fenggui/DecoratorLayer.java src/org/fenggui/Display.java src/org/fenggui/FengGUI.java src/org/fenggui/IWidget.java src/org/fenggui/Item.java src/org/fenggui/List.java src/org/fenggui/ProgressBar.java src/org/fenggui/Widget.java src/org/fenggui/text/content/factory/simple/TextStyle.java src/org/fenggui/text/content/factory/simple/TextStyleEntry.java src/org/fenggui/theme/DefaultTheme.java src/org/fenggui/util/Util.java test/org/fenggui/example/ButtonExample.java test/org/fenggui/example/Everything.java Added Paths: ----------- optional/org/fenggui/composite/filedialog/ optional/org/fenggui/composite/filedialog/FileChooserDialog.java optional/org/fenggui/composite/filedialog/FileDialogListener.java optional/org/fenggui/composite/filedialog/FileDialogWindow.java src/org/fenggui/util/DefaultLogSystem.java src/org/fenggui/util/ILogSystem.java src/org/fenggui/util/Log.java test/org/fenggui/example/FileDialogExample.java Modified: optional/org/fenggui/FengGUIOptional.java =================================================================== --- optional/org/fenggui/FengGUIOptional.java 2009-03-15 15:16:34 UTC (rev 610) +++ optional/org/fenggui/FengGUIOptional.java 2009-03-22 15:58:20 UTC (rev 611) @@ -59,6 +59,12 @@ createTabItem(); } + /** + * + * @param group + * @return + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. + */ public static org.fenggui.composite.tab.TabItem createTabItem(ToggableGroup<RadioButton<Integer>> group) { org.fenggui.composite.tab.TabItem result = createTabItem(); @@ -66,6 +72,11 @@ return result; } + /** + * + * @return + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. + */ public static org.fenggui.composite.tab.TabItem createTabItem() { if (ptTabItem == null) @@ -77,6 +88,14 @@ return result; } + /** + * + * @param parent + * @param containerAlignment + * @param headerAlignment + * @return + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. + */ public static org.fenggui.composite.tab.TabContainer createTab(IContainer parent, Alignment containerAlignment, Alignment headerAlignment) { @@ -87,6 +106,13 @@ return result; } + /** + * + * @param parent + * @param text + * @return + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. + */ public static RotatedLabel createRotatedLabel(IContainer parent, String text) { RotatedLabel l = new RotatedLabel(text); @@ -101,6 +127,7 @@ * @param parent the parent container * @param tabOnTop true if tabs are on top * @return new TabContainer widget. + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. */ public static TabContainer createTabContainer(IContainer parent, boolean tabOnTop) { @@ -115,6 +142,7 @@ * * @param parent the parent container * @return new TabContainer widget. + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. */ public static TabContainer createTabContainer(IContainer parent) { @@ -126,6 +154,7 @@ * @param <T> type parameter * @param parent the parent container * @return new tree widget. + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. */ public static <T> Tree<T> createTree(IContainer parent) { @@ -139,6 +168,7 @@ * Creates a new Table. * @param parent the parent container * @return new Table + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. */ public static Table createTable(IContainer parent) { @@ -153,6 +183,7 @@ * @param parent the parent container * @param model the model used to provide the table with data * @return new Table + * @deprecated Use the generic {@link FengGUI.#createWidget(Class)} instead. */ public static Table createTable(IContainer parent, ITableModel model) { Modified: optional/org/fenggui/composite/GUIInspector.java =================================================================== --- optional/org/fenggui/composite/GUIInspector.java 2009-03-15 15:16:34 UTC (rev 610) +++ optional/org/fenggui/composite/GUIInspector.java 2009-03-22 15:58:20 UTC (rev 611) @@ -115,7 +115,7 @@ { if (!selectionChangedEvent.isSelected()) return; - IWidget source = (IWidget) ((TreeItem) selectionChangedEvent.getToggableWidget()).getUserData(); + IWidget source = (IWidget) ((TreeItem) selectionChangedEvent.getToggableWidget()).getData(); setupDetails(source); } }); Added: optional/org/fenggui/composite/filedialog/FileChooserDialog.java =================================================================== --- optional/org/fenggui/composite/filedialog/FileChooserDialog.java (rev 0) +++ optional/org/fenggui/composite/filedialog/FileChooserDialog.java 2009-03-22 15:58:20 UTC (rev 611) @@ -0,0 +1,1345 @@ +/* + * FengGUI - Java GUIs in OpenGL (http://www.fenggui.org) + * + * Copyright (C) 2005-2009 FengGUI Project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details: + * http://www.gnu.org/copyleft/lesser.html#TOC3 + * + * Created on Mar 22, 2009 + * $Id$ + */ +package org.fenggui.composite.filedialog; + +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EmptyStackException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.Stack; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.FutureTask; +import java.util.concurrent.Semaphore; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Pattern; + +import javax.swing.Icon; +import javax.swing.filechooser.FileSystemView; + +import org.fenggui.Button; +import org.fenggui.ComboBox; +import org.fenggui.Container; +import org.fenggui.FengGUI; +import org.fenggui.Item; +import org.fenggui.Label; +import org.fenggui.List; +import org.fenggui.ScrollContainer; +import org.fenggui.TextEditor; +import org.fenggui.appearance.LabelAppearance; +import org.fenggui.binding.render.Binding; +import org.fenggui.binding.render.Graphics; +import org.fenggui.binding.render.IOpenGL; +import org.fenggui.binding.render.ITexture; +import org.fenggui.binding.render.Pixmap; +import org.fenggui.event.ButtonPressedEvent; +import org.fenggui.event.IButtonPressedListener; +import org.fenggui.event.ISelectionChangedListener; +import org.fenggui.event.SelectionChangedEvent; +import org.fenggui.event.key.Key; +import org.fenggui.event.key.KeyAdapter; +import org.fenggui.event.key.KeyPressedEvent; +import org.fenggui.event.mouse.MouseAdapter; +import org.fenggui.event.mouse.MouseDoubleClickedEvent; +import org.fenggui.layout.BorderLayout; +import org.fenggui.layout.BorderLayoutData; +import org.fenggui.layout.RowExLayout; +import org.fenggui.layout.RowExLayoutData; +import org.fenggui.layout.RowLayout; +import org.fenggui.util.Dimension; + +/** + * This class displays the standard components of a file choosing dialog. + * To retrieve the chosen file from the dialog, attach a FileChooserDialog.FileDialogListener + * to the FileChooserDialog. + * + * @author Sam Bayless + * + */ +public class FileChooserDialog extends Container +{ + + /**Maximum amount of time to wait while another thread is displaying folder contents before giving up.*/ + private static final int DIRECTORY_TIMEOUT = 500; + /**Maximum amount of time to wait before giving up on calling the GL thread.*/ + private static final long TIME_OUT = 1000; + /**Number of types of icons to hold in cache. Items are removed from the cache in the order they were entered.*/ + private final static int LRU_CACHE_SIZE = 100; + /**this determines the number of pixels that are examined from each icon to form a hash number; increase this number if icons are incorrectly identified.*/ + private final static int ICON_FINGERPRINT_SIZE = 16; // + /**The size of an icon.*/ + private final int ICON_DIMENSIONS; + /**The displayed directory.*/ + private File currentDirectory; + /**Thread safe list of previous viewed directories*/ + private Stack<File> previousDirectories = new Stack<File>(); + /**Set of files to display in the top drop down box*/ + private Set<File> rootFiles = new HashSet<File>(); + /**File selected by the user*/ + private File selectedFile = null; + + private ExecutorService threadPool = null; + + private ArrayList<FileDialogListener> fileDialogListeners = new ArrayList<FileDialogListener>(); + + /** + * Whether or not to use icon caching + */ + private final boolean useCache; + + /** + * Whether or not to use multithreaded routines. + */ + private final boolean multithreaded; + /** + * The identity of the openGl thread. Required to prevent deadlocks. + */ + private Thread glThread = null; + + private AtomicBoolean dropDownLock = new AtomicBoolean(); + + private Semaphore directoryUpdateSemaphore = new Semaphore(1); + + /** + * Contains a set of random coordinates used for generating hashes from icons. + */ + private final int[] fingerprintX; + + /** + * Contains a set of random coordinates used for generating hashes from icons. + */ + private final int[] fingerprintY; + + /** + * This is an LRU cache for recently used icon textures. + * See http://blogs.sun.com/swinger/date/20041012#collections_trick_i_lru_cache + */ + private final LinkedHashMap<Integer, Pixmap> iconMap = new LinkedHashMap<Integer, Pixmap>(10, 0.75f, + true) + { + private static final long serialVersionUID = 1; + + @Override + protected boolean removeEldestEntry( + java.util.Map.Entry<Integer, Pixmap> eldest) + { + return size() > LRU_CACHE_SIZE; + } + + }; + + /** + * Holds a simple, thread safe task queue that is executed when the dialog is painted (ie, in the openGL thread). + */ + private ConcurrentLinkedQueue<Runnable> glQueue = new ConcurrentLinkedQueue<Runnable>(); + + private Map<FileFilter, String> fileFilters = new HashMap<FileFilter, String>(); + private FileFilter currentFilter = null; + + private List fileList; + private ComboBox dropDown; + private TextEditor fileName; + private ComboBox filterList; + + private Button upButton; + private Button backButton; + + private ScrollContainer scrollContainer; + + private Container internalContainer; + + /** + * Creates a simple file choosing dialog. + * @param threadPool This parameter is ignored if multithreading is not in use. Otherwise, if null, a new + * ThreadPoolExecutor will be created for this dialog; if you provide a ThreadPool, then the dialog will use + * it for loading file icons. + * @param glThread This parameter is ignored if multithreading is not in use. Certain methods must be run from + * the OpenGL thread (for example, creating a texture). Providing the identity of the glThread, while not necessary, + * is recommended; if the GLThread is not provided, it will attempt to find it out; until it does so, + * multithreading will be disabled. + * @param multithreaded Specify whether to make this dialog multithreaded or not. (It is strongly recommended to use multithreading). + */ + public FileChooserDialog(ExecutorService threadPool, Thread glThread, boolean multithreaded) + { + super(); + this.multithreaded = multithreaded; + this.glThread = glThread; + this.useCache = true;//use icon caching + + //find out the size of a test icon, and assume all other icons will have the same dimensions + File file = FileSystemView.getFileSystemView().getDefaultDirectory(); + if (file != null) + ICON_DIMENSIONS = FileSystemView.getFileSystemView().getSystemIcon(file).getIconWidth(); + else + ICON_DIMENSIONS = 16; + + /* + * Because loading and displaying the files is relatively slow, it is strongly recommended + * to use multithreading with this dialog. + */ + if (!multithreaded) + threadPool = null; + else + { + if (threadPool == null) + this.threadPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 10, TimeUnit.SECONDS, + new SynchronousQueue<Runnable>()); + else + this.threadPool = threadPool; + } + + /* + * Creating textures for icons is expensive, so this dialog will cache recently created + * icon textures. However, there is only one reliable way to determine whether a particular file + * has a particular icon: to load the icons and compare them. + * It would be expensive to compare, pixel for pixel, each icon, so instead a hash is created + * from 16 preselected random pixels (fingerprintX and Y). + * + * + */ + + Random random = new Random(); + + fingerprintX = new int[ICON_FINGERPRINT_SIZE]; + for (int i = 0; i < fingerprintX.length; i++) + { + + fingerprintX[i] = random.nextInt(ICON_DIMENSIONS - 4) + 2; + //restrict the random pixels to not include the outermost ones, + //which are more likely to be transparent + } + + fingerprintY = new int[ICON_FINGERPRINT_SIZE]; + for (int i = 0; i < fingerprintY.length; i++) + { + + fingerprintY[i] = random.nextInt(ICON_DIMENSIONS - 4) + 2; + //restrict the random pixels to not include the outermost ones, + //which are more likely to be transparent + } + + buildComponents(); + setCurrentDirectory(FileSystemView.getFileSystemView().getDefaultDirectory()); + } + + /** + * Create a file dialog that is multithreaded. + */ + public FileChooserDialog() + { + this(null, null, true); + } + + /** + * Set the current directory to display + * @param file + */ + public void setCurrentDirectory(File file) + { + setCurrentDirectory(file, false); + } + + /** + * Go back to the last seen directory + */ + public void back() + { + synchronized (previousDirectories) + { + File file; + try + { + if ((file = previousDirectories.pop()) != null) + { + setCurrentDirectory(file, true); + } + } + catch (EmptyStackException e) + { + //do nothing + } + } + } + + /** + * Display the files in the current folder. + */ + public void refreshFiles() + { + if (!multithreaded || (glThread == null)) + { + try + { + if (directoryUpdateSemaphore.tryAcquire(DIRECTORY_TIMEOUT, TimeUnit.MILLISECONDS)) + { + + try + { + + final FileFilter filter = this.getCurrentFilter(); + final File file = currentDirectory; + if (file == null || !file.isDirectory()) + return; + fileList.clear(); + populateDropDown(dropDown, file); + //this can be slow - if possible, put it into a separate thread. + + ArrayList<FileItem> items = new ArrayList<FileItem>(); + for (File f : file.listFiles(filter)) + { + if (!f.isHidden()) + { + FileItem item = new FileItem(f); + items.add(item); + } + } + + Collections.sort(items); + + for (FileItem item : items) + { + Item listItem = new Item(item.toString(), getIcon(item.getFile()), fileList.getAppearance()); + listItem.setData(item); + fileList.addItem(listItem); + } + scrollContainer.scrollVertical(1); + } + finally + {//release the semaphore no matter what happens + directoryUpdateSemaphore.release(); + } + } + } + catch (InterruptedException e) + { + return; + } + + } + else + { + threadPool.execute(new Runnable() + { + + public void run() + { + try + { + + if (directoryUpdateSemaphore.tryAcquire(DIRECTORY_TIMEOUT, TimeUnit.MILLISECONDS)) + { + + try + { + + final FileFilter filter = getCurrentFilter(); + final File file = currentDirectory; + if (file == null || !file.isDirectory()) + return; + fileList.clear(); + populateDropDown(dropDown, file); + ArrayList<FileItem> items = new ArrayList<FileItem>(); + if (filter != null) + { + File[] files = file.listFiles(filter); + if (files != null) + { + + for (File f : files) + { + if (!f.isHidden()) + { + FileItem item = new FileItem(f); + items.add(item); + } + } + + } + else + {//For unknown reasons, my computer returns a null list of files when given a filter, so try again if that happens without a filter. + files = file.listFiles(); + if (files != null) + { + for (File f : files) + { + if (!f.isHidden()) + { + FileItem item = new FileItem(f); + items.add(item); + } + } + } + } + } + else + { + File[] files = file.listFiles(); + if (files != null) + { + for (File f : files) + { + if (!f.isHidden()) + { + FileItem item = new FileItem(f); + items.add(item); + } + } + } + } + if (items.isEmpty()) + return; + Collections.sort(items); + scrollContainer.scrollVertical(1); + final FileItem lastItem = items.get(items.size() - 1); + for (final FileItem item : items) + { + final Pixmap icon = getIcon(item.getFile()); + + try + { + executeInGL(new Callable<Object>() + {//This has to be executed from the GL thread, otherwise the list will jump between scroll positions in an ugly way while it is being filled + public Object call() throws Exception + { + try + { + if (icon != null) + { + Item listItem = new Item(item.toString(), icon, fileList.getAppearance()); + listItem.setData(item); + fileList.addItem(listItem); + } + else + { + Item listItem = new Item(item.toString(), fileList.getAppearance()); + listItem.setData(item); + fileList.addItem(listItem); + } + scrollContainer.scrollVertical(1); + } + finally + { + if (item == lastItem) + directoryUpdateSemaphore.release(); + //allow the directory to be refreshed after the file is displayed + } + return null; + } + + }); + } + catch (Exception e) + { + + } + + } + scrollContainer.scrollVertical(1); + } + finally + { + + } + } + } + catch (InterruptedException e) + { + + } + } + + }); + } + + } + + public void setCurrentDirectory(final File file, boolean dontAddToHistory) + { + if (file == null || !file.isDirectory()) + return; + File currentDirectory = this.getCurrentDirectory(); + if (currentDirectory != null && currentDirectory.equals(file)) + return; + + if (!dontAddToHistory && currentDirectory != null) + { + synchronized (previousDirectories) + { + previousDirectories.add(currentDirectory); + } + } + this.currentDirectory = file; + setSelectedFile(null); + refreshFiles(); + } + + /** + * Execute the callable from the GL thread, sometime in the future. + * @param toCall + */ + @SuppressWarnings("unchecked") + private void executeInGL(Callable<?> toCall) throws Exception + { + if (glThread == null) + return; + if (!multithreaded || Thread.currentThread() == glThread) + { + toCall.call(); + } + else + { + FutureTask<?> task = new FutureTask(toCall); + glQueue.add(task); + + } + } + + /** + * Execute the callable from the GL thread, and wait until it returns; + * @param <E> + * @param toCall + * @return + */ + private <E> E callFromGL(Callable<E> toCall) throws Exception + { + if (glThread == null) + throw new Exception("GL Thread not known"); + if (!multithreaded || Thread.currentThread() == glThread) + { + return toCall.call(); + } + else + { + FutureTask<E> task = new FutureTask<E>(toCall); + glQueue.add(task); + return task.get(TIME_OUT, TimeUnit.MILLISECONDS); + } + } + + private BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); + + private int computeHash(BufferedImage image) + { + long hash = 31;//prime value + for (int i = 0; i < fingerprintX.length; i++) + { + hash *= image.getRGB(fingerprintX[i], fingerprintY[i]) + 1; + hash %= Integer.MAX_VALUE; + + } + + return (int) hash; + } + + /** + * Efficiently get the icon for this file, if it exists. + * Retrieved icons are cached for later use. + * Returns null if no icon could be found. + * @param file + * @return + */ + private Pixmap getIcon(final File file) + { + + FileSystemView view = FileSystemView.getFileSystemView(); + + //final String fileType = view.getSystemTypeDescription(file); + //Unfortunately, on some platforms (Windows), files and folders that have different icons will have the same description. + //For example, My Documents may have a unique icon, but will have the same description as other folders. + //If a cache is used, this can lead to incorrect icons. + + Icon icon = view.getSystemIcon(file); + + //Because only one Image context is being used, it is important that only one thread access it at a time. + synchronized (img) + { + Graphics2D graphics = img.createGraphics(); + Composite previousComposite = graphics.getComposite(); + + //Erase any previous texture in this icon + graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f)); + graphics.setColor(java.awt.Color.WHITE); + graphics.fillRect(0, 0, img.getWidth(), img.getHeight()); + graphics.setComposite(previousComposite); + + icon.paintIcon(null, graphics, 0, 0); + + int hash = computeHash(img); + + if (useCache) + { + if (iconMap.containsKey(hash)) + { + return iconMap.get(hash); + } + } + + Pixmap pixmap; + + if (!multithreaded || glThread == null || Thread.currentThread() == glThread) + { + ITexture texture = Binding.getInstance().getTexture(img); + pixmap = new Pixmap(texture); + } + else + { + Callable<Pixmap> pixCall = new Callable<Pixmap>() + { + public Pixmap call() + { + ITexture texture = Binding.getInstance().getTexture(img); + Pixmap pixmap = new Pixmap(texture); + + return pixmap; + } + }; + + try + { + pixmap = callFromGL(pixCall); + } + catch (Exception e) + { + pixmap = null; + } + } + if (useCache && pixmap != null) + iconMap.put(hash, pixmap); + return pixmap; + + } + + } + + /** + * Set common root files to appear in the top drop down box. + */ + private void setRootFiles() + { + FileSystemView view = FileSystemView.getFileSystemView(); + + for (File f : view.getRoots()) + { + if (!f.isHidden()) + { + + rootFiles.add(f); + } + } + rootFiles.add(view.getHomeDirectory()); + File home = new File(System.getProperty("user.home")); + if (!home.equals(view.getHomeDirectory())) + {//on some systems (including Vista) these are not the same + rootFiles.add(home); + } + } + + /** + * Add a folder to appear in the top drop down box of the dialog. + * Call refreshFiles to display the change. + * @param file + */ + public void addToRoots(File file) + { + rootFiles.add(file); + } + + /** + * Remove a folder from the top drop down box of the dialog. + * Call refreshFiles to display the change. + * @param file + */ + public void removeFromRoots(File file) + { + rootFiles.remove(file); + } + + /** + * Get the list of files in the top drop down box. + * Changes to this list will be reflected in changes to the displayed folders (once refreshFiles is called). + * @return + */ + public Set<File> getRootFiles() + { + return rootFiles; + } + + /** + * Populate the drop down with the root folders, and the current directory, and ensure the current directory is selected. + * @param dropDown + * @param currentDirectory + */ + private void populateDropDown(ComboBox dropDown, File currentDirectory) + { + try + { + dropDownLock.set(true); + dropDown.getList().clear(); + LabelAppearance appearance = dropDown.getList().getAppearance(); + for (File file : rootFiles) + { + FileItem item = new FileItem(file); + Item listItem = new Item(item.toString(), getIcon(item.getFile()), appearance); + listItem.setData(item); + dropDown.addItem(listItem); + + if (file.equals(currentDirectory)) + dropDown.setSelected(listItem); + } + + if (!rootFiles.contains(currentDirectory)) + { + FileItem item = new FileItem(currentDirectory); + Item current = new Item(item.toString(), getIcon(item.getFile()), appearance); + current.setData(item); + dropDown.addItem(current); + dropDown.setSelected(current); + } + } + finally + { + dropDownLock.set(false); + //dropDownSemaphore.release(); + } + + } + + /** + * Signal that a file has been selected to the listeners. + */ + private synchronized void fileSelected() + { + + File file = selectedFile; + for (FileDialogListener listener : fileDialogListeners.toArray(new FileDialogListener[fileDialogListeners.size()])) + { + listener.fileSelected(file); + } + } + + /** + * Signal that no file was selected and the dialog was cancelled. + */ + public synchronized void cancel() + { + for (FileDialogListener listener : fileDialogListeners.toArray(new FileDialogListener[fileDialogListeners.size()])) + { + listener.cancel(); + } + } + + /** + * Construct all the inner components of the dialog. They will be loaded with the current theme. + */ + private void buildComponents() + { + + internalContainer = this; + + internalContainer.setLayoutManager(new BorderLayout()); + + Container topRow = new Container(); + topRow.setLayoutData(BorderLayoutData.NORTH); + topRow.setLayoutManager(new RowExLayout()); + internalContainer.addWidget(topRow); + + dropDown = new ComboBox(); + dropDown.setLayoutData(new RowExLayoutData(true, true)); + + topRow.addWidget(dropDown); + FengGUI.getTheme().setUp(dropDown); + + dropDown.addSelectionChangedListener(new ISelectionChangedListener() + { + + public void selectionChanged(SelectionChangedEvent selectionChangedEvent) + { + if (dropDownLock.get()) + return; + + File file = ((FileItem) ((Item) dropDown.getSelectedItem()).getData()).getFile(); + setCurrentDirectory(file); + + } + + }); + + //This container defines the bottom section of the dialog + Container south = FengGUI.createContainer(internalContainer); + south.setLayoutData(BorderLayoutData.SOUTH); + south.setLayoutManager(new RowExLayout(false)); + + Container fileNameContainer = FengGUI.createContainer(south); + fileNameContainer.setLayoutData(new RowExLayoutData(true, true)); + fileNameContainer.setLayoutManager(new RowExLayout()); + + Label nameLabel = FengGUI.createLabel(fileNameContainer); + nameLabel.setText("Files Name: "); + nameLabel.setLayoutData(new RowExLayoutData(false, false)); + + fileName = FengGUI.createTextEditor(fileNameContainer); + fileName.setLayoutData(new RowExLayoutData(true, true)); + fileName.addKeyListener(new KeyAdapter() + { + @Override + public void keyPressed(KeyPressedEvent keyPressedEvent) + { + if (keyPressedEvent.getKeyClass() == Key.ENTER) + { + attemptSelectFile(fileName.getText()); + keyPressedEvent.setUsed(); + fileSelected(); + } + else if (keyPressedEvent.getKeyClass() == Key.ESCAPE) + { + keyPressedEvent.setUsed(); + cancel(); + } + } + }); + + Container filterContainer = FengGUI.createContainer(south); + filterContainer.setLayoutData(new RowExLayoutData(true, true)); + filterContainer.setLayoutManager(new RowExLayout()); + + Label filterLabel = FengGUI.createLabel(filterContainer); + filterLabel.setText("Files of Type: "); + filterLabel.setLayoutData(new RowExLayoutData(false, false)); + + filterList = FengGUI.createComboBox(filterContainer); + FileFilter filter = generateFileFilter("All Files", "*"); + addFileFilter(filter, "All Files"); + + updateFilterList(); + setCurrentFilter(filter); + + filterList.setLayoutData(new RowExLayoutData(true, true)); + + filterList.addSelectionChangedListener(new ISelectionChangedListener() + { + + public void selectionChanged(SelectionChangedEvent selectionChangedEvent) + { + if (filterList.getSelectedItem() != null) + { + FileFilter filter = ((FileFilter) ((Item) filterList.getSelectedItem()).getData()); + if (filter != null) + { + setCurrentFilter(filter); + } + + } + + } + + }); + + Container buttonContainer = FengGUI.createContainer(south); + buttonContainer.setLayoutData(new RowExLayoutData(true, true)); + buttonContainer.setLayoutManager(new BorderLayout()); + + Container buttons = FengGUI.createContainer(buttonContainer); + buttons.setLayoutManager(new RowLayout()); + buttons.setLayoutData(BorderLayoutData.EAST); + + Button acceptButton = FengGUI.createButton(buttons, "OK"); + acceptButton.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + attemptSelectFile(fileName.getText()); + e.setUsed(); + fileSelected(); + } + + }); + + Button cancelButton = FengGUI.createButton(buttons, "Cancel"); + + cancelButton.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + e.setUsed(); + cancel(); + } + + }); + + backButton = new Button(); + backButton.setLayoutData(new RowExLayoutData(true, false)); + topRow.addWidget(backButton); + FengGUI.getTheme().setUp(backButton); + + backButton.setText("Back"); + + upButton = new Button(); + upButton.setLayoutData(new RowExLayoutData(true, false)); + + topRow.addWidget(upButton); + FengGUI.getTheme().setUp(upButton); + + upButton.setText("Up"); + + backButton.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + back(); + } + + }); + + upButton.addButtonPressedListener(new IButtonPressedListener() + { + + public void buttonPressed(ButtonPressedEvent e) + { + File file; + if ((file = getCurrentDirectory()) != null) + { + + File parent = file.getParentFile(); + if (parent != null) + setCurrentDirectory(parent); + } + } + + }); + + setRootFiles(); + + scrollContainer = FengGUI.createScrollContainer(internalContainer); + + scrollContainer.setLayoutData(BorderLayoutData.CENTER); + // internalContainer.addWidget(scrollContainer); + + fileList = FengGUI.createWidget(List.class);//FengGUI.<FileItem>createList(scrollContainer) ;//new List<FileItem>() ; + //scrollContainer.addWidget(fileList); + scrollContainer.setInnerWidget(fileList); + + fileList.setTraversable(true); + fileList.setToggle(false); + + fileList.addKeyListener(new KeyAdapter() + { + @Override + public void keyPressed(KeyPressedEvent keyPressedEvent) + { + if (keyPressedEvent.getKeyClass() == Key.ENTER) + { + keyPressedEvent.setUsed(); + Item Item = fileList.getSelectedItem(); + if (Item != null) + { + if (((FileItem) Item.getData()).getFile().isDirectory()) + { + //move to that folder + setCurrentDirectory(((FileItem) Item.getData()).getFile()); + + } + else + { + setSelectedFile(((FileItem) Item.getData()).getFile(), true); + + fileSelected(); + } + } + + } + else if (keyPressedEvent.getKeyClass() == Key.ESCAPE) + { + keyPressedEvent.setUsed(); + cancel(); + } + } + }); + + fileList.getToggableWidgetGroup().addSelectionChangedListener(new ISelectionChangedListener() + { + + public void selectionChanged(SelectionChangedEvent selectionChangedEvent) + { + + Item Item = fileList.getSelectedItem(); + selectionChangedEvent.setUsed(); + if (Item != null) + { + if (((FileItem) Item.getData()).getFile().isFile()) + setSelectedFile(((FileItem) Item.getData()).getFile(), true); + } + + } + + }); + + fileList.addMouseListener(new MouseAdapter() + { + + @Override + public void mouseDoubleClicked(MouseDoubleClickedEvent mouseDoubleClickedEvent) + { + mouseDoubleClickedEvent.setUsed(); + Item Item = fileList.getSelectedItem(); + if (Item != null) + { + if (((FileItem) Item.getData()).getFile().isDirectory()) + { + //move to that folder + setCurrentDirectory(((FileItem) Item.getData()).getFile()); + + } + else + { + setSelectedFile(((FileItem) Item.getData()).getFile(), true); + + fileSelected(); + } + } + } + + }); + + internalContainer.setMinSize(this.getMinContentSize()); + //internalContainer.setSizeToMinSize(); + + Dimension minContent = buttonContainer.getMinContentSize(); + buttonContainer.setMinSize(minContent); + internalContainer.layout(); + south.layout(); + buttonContainer.layout(); + buttons.layout(); + filterContainer.layout(); + + topRow.layout(); + + } + + /** + * Attempt to select the given file, if it exists + * @param fileName + */ + private void attemptSelectFile(String fileName) + { + + File file = new File(getCurrentDirectory().getPath() + "/" + fileName); + if (file != null && file.exists()) + { + setSelectedFile(file); + } + + } + + /** + * Set the currently selected file. + * @param file + */ + public void setSelectedFile(File file) + { + setSelectedFile(file, false); + } + + /** + * Set the currently selected file list, but do not update the file list's display. + * @param file + * @param ignoreFileList + */ + private void setSelectedFile(File file, boolean ignoreFileList) + { + selectedFile = file; + if (file == null) + { + Item selectedItem = fileList.getSelectedItem(); + if (!ignoreFileList && selectedItem != null) + selectedItem.setSelected(false); + fileName.setText(""); + } + else + { + if (!ignoreFileList) + { + for (int i = 0; i < fileList.size(); i++) + { + Item item = fileList.getItem(i); + if (((FileItem) item.getData()).getFile().equals(file)) + { + fileList.setSelectedIndex(i); + break; + } + } + } + fileName.setText(file.getName()); + } + } + + /** + * Get the currently displayed directory. + * @return + */ + public File getCurrentDirectory() + { + return currentDirectory; + } + + /** + * Get the list of file filters displayed in the bottom of the dialog. + * Changes to this list will be reflected in changes to that drop down + * box, once updateFilterList() is called. + * @return + */ + public Set<FileFilter> getFileFilters() + { + return fileFilters.keySet(); + } + + /** + * Add a file filter with the given pattern (ie, *, *.*, or *.txt) to the list of filters. + * @param description + * @param pattern + */ + public void addFileFilter(String description, String pattern) + { + addFileFilter(FileChooserDialog.generateFileFilter(description, pattern), description); + + } + + /** + * Add a file filter to the list of file filters displayed at the bottom of the screen.. + * @param filter + * @param description + */ + public void addFileFilter(FileFilter filter, String description) + { + this.fileFilters.put(filter, description); + updateFilterList(); + } + + /** + * Remove a file filter from the list of displayed filters. + * @param filter + */ + public void removeFileFilter(FileFilter filter) + { + this.fileFilters.remove(filter); + updateFilterList(); + } + + /** + * Clear the list of displayed file filters. + */ + public void clearFileFilters() + { + this.fileFilters.clear(); + updateFilterList(); + } + + /** + * Updates the file filters displayed in the comboBox. + * Called automatically by addFileFilter and removeFileFilter. + */ + public void updateFilterList() + { + + filterList.getList().clear(); + LabelAppearance appearance = filterList.getList().getAppearance(); + + for (FileFilter filter : fileFilters.keySet()) + { + Item item = new Item(fileFilters.get(filter), appearance); + item.setData(filter); + filterList.addItem(item); + } + } + + /** + * Get the list of currently attached file listeners. + * @return + */ + public ArrayList<FileDialogListener> getFileDialogListeners() + { + return fileDialogListeners; + } + + /** + * Attach a listener to receive events when a file is selected, or the dialog is cancelled. + * @return + */ + public void addListener(FileDialogListener listener) + { + this.fileDialogListeners.add(listener); + } + + /** + * Remove a File Dialog Listener. + * @param listener + */ + public void removeListener(FileDialogListener listener) + { + this.fileDialogListeners.remove(listener); + } + + @Override + public void paintContent(Graphics g, IOpenGL gl) + { + //Inject code into the GL thread here + if (glThread == null) + glThread = Thread.currentThread(); + + Runnable task = glQueue.poll(); + do + { + if (task == null) + break; + task.run(); + + } while (((task = glQueue.poll()) != null)); + + super.paintContent(g, gl); + } + + /** + * Get the currently used file filter. + * @return + */ + public FileFilter getCurrentFilter() + { + return currentFilter; + } + + /** + * Set the currently selected file filter. + * @param currentFilter + */ + public void setCurrentFilter(FileFilter currentFilter) + { + if (this.currentFilter != currentFilter) + { + this.currentFilter = currentFilter; + refreshFiles(); + } + } + + /** + * Generates a FileFilter for the given pattern. + * @param description + * @param pattern + * @return + */ + public static FileFilter generateFileFilter(String description, String pattern) + { + //Wrap the javax.swing.filechooser.FileNameExtensionFilter in java.io.FileFilter interface + + //final FileNameExtensionFilter extFilter = new FileNameExtensionFilter(description, pattern ); + //have to alter the pattern to turn it into a regex + + pattern = pattern.replace(".", "\\."); + pattern = pattern.replace("*", ".*"); + Pattern filter = Pattern.compile(pattern); + return new FilePatternFilter(filter); + } + +} + +class FilePatternFilter implements FileFilter +{ + private Pattern pattern; + + public FilePatternFilter(Pattern pattern) + { + super(); + this.pattern = pattern; + } + + public boolean accept(File pathname) + { + if (pathname != null) + { + if (pathname.isDirectory()) + { + return true; + } + + if (pattern.matcher(pathname.getName()).matches()) + { + return true; + } + } + return false; + } + +} + +class FileItem implements Comparable<FileItem> +{ + private String name; + + public int compareTo(FileItem o) + { + //directories are always before files + if (o.getFile().isDirectory() && !getFile().isDirectory()) + return 1; + else if (!o.getFile().isDirectory() && getFile().isDirectory()) + return -1; + + return getFile().getName().compareTo(o.getFile().getName()); + } + + File file; + + public FileItem(File file) + { + super(); + name = FileSystemView.getFileSystemView().getSystemDisplayName(file); + if (name.isEmpty()) + name = file.toString(); + this.file = file; + } + + public File getFile() + { + return file; + } + + @Override + public String toString() + { + + return name; + } + +} \ No newline at end of file Added: optional/org/fenggui/composite/filedialog/FileDialogListener.java =================================================================== --- optional/org/fenggui/composite/filedialog/FileDialogListener.java (rev 0) +++ optional/org/fenggui/composite/filedialog/FileDialogListener.java 2009-03-22 15:58:20 UTC (rev 611) @@ -0,0 +1,37 @@ +/* + * FengGUI - Java GUIs in OpenGL (http://www.fenggui.org) + * + * Copyright (C) 2005-2009 FengGUI Project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details: + * http://www.gnu.org/copyleft/lesser.html#TOC3 + * + * Created on Mar 22, 2009 + * $Id$ + */ +package org.fenggui.composite.filedialog; + +import java.io.File; + +/** + * This interface is main way to find out when the user has selected a file, or cancelled the dialog. + * If this dialog is not attached to a FileDialogWindow, then steps should be taken on recieving + * an event to hide this dialog (the FileDialogWindow will do this itself). + * + * @author Sam Bayless + * + */ +public interface FileDialogListener +{ + public void fileSelected(File file); + + public void cancel(); +} \ No newline at end of file Added: optional/org/fenggui/composite/filedialog/FileDialogWindow.java =================================================================== --- optional/org/fenggui/composite/filedialog/FileDialogWindow.java (rev 0) +++ optional/org/fenggui/composite/filedialog/FileDialogWindow.java 2009-03-22 15:58:20 UTC (rev 611) @@ -0,0 +1,130 @@ +/* + * FengGUI - Java GUIs in OpenGL (http://www.fenggui.org) + * + * Copyright (C) 2005-2009 FengGUI Project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details: + * http://www.gnu.org/copyleft/lesser.html#TOC3 + * + * Created on Mar 22, 2009 + * $Id$ + */ +package org.fenggui.composite.filedialog; + +import java.io.File; + +import org.fenggui.Display; +import org.fenggui.FengGUI; +import org.fenggui.composite.Window; +import org.fenggui.event.IWindowClosedListener; +import org.fenggui.event.WindowClosedEvent; +import org.fenggui.layout.BorderLayoutData; + +/** + * A window containing a file open/save dialog. + * To retrieve the chosen file from the dialog, attach a FileChooserDialog.FileDialogListener + * to the FileChooserDialog. + * + * @author Sam Bayless + * + */ +public class FileDialogWindow extends Window +{ + private FileChooserDialog dialog; + + public FileDialogWindow() + { + super(); + build(); + } + + public FileDialogWindow(boolean closeBtn, boolean maximizeBtn, boolean minimizeBtn, boolean autoClose) + { + super(closeBtn, maximizeBtn, minimizeBtn, autoClose); + build(); + } + + public FileDialogWindow(boolean closeBtn, boolean maximizeBtn, boolean minimizeBtn) + { + super(closeBtn, maximizeBtn, minimizeBtn); + build(); + } + + private void build() + { + Window window = this; + dialog = new FileChooserDialog(null, null, true); + + FengGUI.getTheme().setUp(window); + + window.setTitle("File Dialog"); + + dialog.setLayoutData(BorderLayoutData.CENTER); + window.getContentContainer().addWidget(dialog); + + window.getContentContainer().layout(); + dialog.layout(); + + dialog.addListener(new FileDialogListener() + { + public void cancel() + { + dialog.removeListener(this); + if (getParent() != null) + close(); + } + + public void fileSelected(final File file) + { + dialog.removeListener(this); + if (getParent() != null) + close(); + } + + }); + + this.addWindowClosedListener(new IWindowClosedListener() + { + + public void windowClosed(WindowClosedEvent windowClosedEvent) + { + dialog.cancel(); + + } + + }); + } + + /** + * Get the FileChooserDialog in this window. + * @return + */ + public FileChooserDialog getDialog() + { + return dialog; + } + + /** + * Convenience method to create and display a file dialog window. + * @param display + * @return + */ + public static FileDialogWindow displayFileDialog(Display display) + { + FileDialogWindow window = new FileDialogWindow(true, false, false, true); + + window.setSize(display.getWidth() / 2, display.getHeight() / 2); + display.addWidget(window); + + return window; + } + +} Modified: optional/org/fenggui/composite/tree/Tree.java =================================================================== --- optional/org/fenggui/composite/tree/Tree.java 2009-03-15 15:16:34 UTC (rev 610) +++ optional/org/fenggui/composite/tree/Tree.java 2009-03-22 15:58:20 UTC (rev 611) @@ -91,7 +91,7 @@ root.removeAllChilds(getAppearance()); @SuppressWarnings("unchecked") - E dataRoot = (E) root.getUserData(); + E dataRoot = (E) root.getData(); if (model.hasChildren(dataRoot)) { int childCount = model.getNumberOfChildren(dataRoot); Modified: src/org/fenggui/DecoratorLayer.java =================================================================== --- src/org/fenggui/DecoratorLayer.java 2009-03-15 15:16:34 UTC (rev 610) +++ src/org/fenggui/DecoratorLayer.java 2009-03-22 15:58:20 UTC (rev 611) @@ -37,9 +37,9 @@ * @author Johannes Schaback, last edited by $Author$, $Date$ * @version $Revision$ */ -public class DecoratorLayer implements IXMLStreamable +public class DecoratorLayer implements IXMLStreamable, Cloneable { - private ArrayList<IDecorator> decorators = new ArrayList<IDecorator>(); + private java.util.List<IDecorator> decorators = new ArrayList<IDecorator>(); public DecoratorLayer(InputOnlyStream stream) throws IOException, IXMLStreamableException { @@ -91,11 +91,12 @@ stream.processChildren(decorators, XMLTheme.TYPE_REGISTRY); } - public void add(IDecorator d) + public void add(IDecorator... array) { - decorators.add(d); + for (IDecorator d : array) + decorators.add(d); } - + public void clear() { decorators.clear(); @@ -108,4 +109,13 @@ { return GENERATE_NAME; } + + public Object clone() throws CloneNotSupportedException + { + DecoratorLayer result = (DecoratorLayer) super.clone(); + + //Decorators can't be changed so just add all to this layer + result.decorators.addAll(decorators); + return result; + } } Modified: src/org/fenggui/Display.java =================================================================== --- src/org/fenggui/Display.java 2009-03-15 15:16:34 UTC (rev 610) +++ src/org/fenggui/Display.java 2009-03-22 15:58:20 UTC (rev 611) @@ -27,12 +27,28 @@ import org.fenggui.binding.render.Graphics; import org.fenggui.binding.render.IOpenGL; import org.fenggui.composite.IWindow; -import org.fenggui.event.*; +import org.fenggui.event.DisplayResizedEvent; +import org.fenggui.event.Event; +import org.fenggui.event.FocusEvent; +import org.fenggui.event.IDisplayResizedListener; +import org.fenggui.event.IDragAndDropListener; +import org.fenggui.event.IEventListener; +import org.fenggui.event.ITickListener; +import org.fenggui.event.SizeChangedEvent; +import org.fenggui.event.TickEvent; import org.fenggui.event.key.Key; import org.fenggui.event.key.KeyPressedEvent; import org.fenggui.event.key.KeyReleasedEvent; import org.fenggui.event.key.KeyTypedEvent; -import org.fenggui.event.mouse.*; +import org.fenggui.event.mouse.MouseButton; +import org.fenggui.event.mouse.MouseClickedEvent; +import org.fenggui.event.mouse.MouseDoubleClickedEvent; +import org.fenggui.event.mouse.MouseDraggedEvent; +import org.fenggui.event.mouse.MouseEnteredEvent; +import org.fenggui.event.mouse.MouseExitedEvent; +import org.fenggui.event.mouse.MousePressedEvent; +import org.fenggui.event.mouse.MouseReleasedEvent; +import org.fenggui.event.mouse.MouseWheelEvent; import org.fenggui.layout.LayoutManager; import org.fenggui.layout.StaticLayout; import org.fenggui.theme.XMLTheme; Modified: src/org/fenggui/FengGUI.java =================================================================== --- src/org/fenggui/FengGUI.java 2009-03-15 15:16:34 UTC (rev 610) +++ src/org/fenggui/FengGUI.java 2009-03-22 15:58:20 UTC (rev 611) @@ -18,6 +18,9 @@ */ package org.fenggui; +import java.util.HashMap; +import java.util.Map; + import org.fenggui.binding.render.Binding; import org.fenggui.binding.render.ITexture; import org.fenggui.binding.render.Pixmap; @@ -26,7 +29,11 @@ import org.fenggui.composite.menu.MenuBar; import org.fenggui.composite.menu.MenuItem; import org.fenggui.theme.ITheme; +import org.fenggui.util.Log; +import org.fenggui.util.Util; +import com.sun.opengl.impl.Java2D; + /** * This class provides some basic information about FengGUI to applications. * @@ -36,25 +43,27 @@ public class FengGUI { //Basic FengGUI information for others to read out. - public static final String VERSION = "Alpha 12 SVN"; - public static final String NAME = "FengGUI"; - public static final String WEB = "http://www.fenggui.org"; + public static final String VERSION = "Alpha 12 SVN"; + public static final String NAME = "FengGUI"; + public static final String WEB = "http://www.fenggui.org"; //widget prototypes (already themed) - private static Button ptButton = null; - private static Container ptContainer = null; - private static ScrollContainer ptScrollContainer = null; - private static Label ptLabel = null; - private static TextEditor ptTextEditor = null; - private static ScrollBar ptScrollBarH = null; - private static ScrollBar ptScrollBarV = null; + private static Button ptButton = null; + private static Container ptContainer = null; + private static ScrollContainer ptScrollContainer = null; + private static Label ptLabel = null; + private static TextEditor ptTextEditor = null; + private static ScrollBar ptScrollBarH = null; + private static ScrollBar ptScrollBarV = null; @SuppressWarnings("unchecked") - private static RadioButton ptRadioButton = null; + private static RadioButton ptRadioButton = null; @SuppressWarnings("unchecked") - private static CheckBox ptCheckBox = null; + private static CheckBox ptCheckBox = null; - private static ITheme theme = null; + private static Map<Class<?>, IWidget> ptList = null; + private static ITheme theme = null; + /** * Inits the widget prototypes. This can be called to initialize all * prototypes at once. Very useful on loading screens. @@ -88,8 +97,61 @@ ptTextEditor = null; ptScrollBarH = null; ptScrollBarV = null; + if (ptList != null) + ptList.clear(); } + /** + * Created a themed instance of a Widget. This is the preferred way to create widgets. It + * handles a cache of prototype widgets to improve speed. Only widgets which implement the + * {@link Cloneable} interface can be used by caching mechanism. + * + * @param <T> + * @param widgetClass The class of the Widget to create a instance from. + * @return a themed instance of a widget. + */ + public static <T extends IWidget> T createWidget(Class<T> widgetClass) + { + T widget = null; + boolean cloneableClass = widgetClass.isAssignableFrom(Cloneable.class); + if (cloneableClass) + { + if (ptList == null) + ptList = new HashMap<Class<?>, IWidget>(20); + + //check prototype + if (ptList.containsKey(widgetClass)) + { + try + { + return (T) ptList.get(widgetClass).clone(); + } + catch (CloneNotSupportedException e) + { + Log.error("Couldn't clone a Widget that implements the Clonable interface. %1", e, widgetClass + .getSimpleName()); + } + } + } + + widget = Util.createInstanceOfClass(widgetClass); + FengGUI.setUpAppearance(widget); + + if (cloneableClass) + { + try + { + ptList.put(widgetClass, (T) widget.clone()); + } + catch (CloneNotSupportedException e) + { + Log.error("Couldn't clone a Widget that implements the Clonable interface. %1", e, widgetClass.getSimpleName()); + } + } + + return widget; + } + // /** // * Create a TabContainer widget. // * @@ -110,6 +172,7 @@ * Creates a new progress bar. * @param parent the parent container * @return new progress bar + * @deprecated Use the generic {@link #createWidget(Class)} instead. */ public static ProgressBar createProgressBar(IContainer parent) { @@ -123,6 +186,7 @@ * Creates a new combo box. * @param parent the parent container * @return new combo box + * @deprecated Use the generic {@link #createWidget(Class)} instead. */ public static ComboBox createComboBox(IContainer parent) { @@ -131,6 +195,11 @@ return btn; } + /** + * + * @return + * @deprecated Use the generic {@link #createWidget(Class)} instead. + */ public static ComboBox createComboBox() { ComboBox btn = new ComboBox(); @@ -138,6 +207,12 @@ return btn; } + /** + * + * @param parent + * @return + * @deprecated Use the generic {@link #createWidget(Class)} instead. + */ public static Button createButton(IContai... [truncated message content] |