diff --git a/folderIconBase.xcf b/folderIconBase.xcf index 6ee67cf..1a0a6c2 100644 Binary files a/folderIconBase.xcf and b/folderIconBase.xcf differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png b/src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png new file mode 100644 index 0000000..4ad606c Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png b/src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png new file mode 100644 index 0000000..28bf189 Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png b/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png new file mode 100644 index 0000000..718313d Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png b/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png new file mode 100644 index 0000000..a4c74b7 Binary files /dev/null and b/src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png differ diff --git a/src/com/gpl/rpg/atcontentstudio/model/GameDataElement.java b/src/com/gpl/rpg/atcontentstudio/model/GameDataElement.java index 534b715..5643f57 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/GameDataElement.java +++ b/src/com/gpl/rpg/atcontentstudio/model/GameDataElement.java @@ -11,6 +11,8 @@ import java.util.concurrent.ConcurrentHashMap; import javax.swing.tree.TreeNode; +import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarkEntry; + public abstract class GameDataElement implements ProjectTreeNode, Serializable { private static final long serialVersionUID = 2028934451226743389L; @@ -31,6 +33,8 @@ public abstract class GameDataElement implements ProjectTreeNode, Serializable { public boolean writable = false; + public BookmarkEntry bookmark = null; + //List of objects whose transition to "linked" state made them point to this instance. private Map backlinks = new ConcurrentHashMap(); diff --git a/src/com/gpl/rpg/atcontentstudio/model/Project.java b/src/com/gpl/rpg/atcontentstudio/model/Project.java index 31e4f61..e8182ca 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/Project.java +++ b/src/com/gpl/rpg/atcontentstudio/model/Project.java @@ -48,6 +48,7 @@ import com.gpl.rpg.atcontentstudio.Notification; import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter; import com.gpl.rpg.atcontentstudio.io.SettingsSave; import com.gpl.rpg.atcontentstudio.model.GameSource.Type; +import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarksRoot; import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition; import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue; import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist; @@ -87,6 +88,8 @@ public class Project implements ProjectTreeNode, Serializable { public GameSource referencedContent; //Pointers to base content public transient GameSource alteredContent; //Copied from base content (does not overwrite yet) public transient GameSource createdContent; //Stand-alone. + public transient BookmarksRoot bookmarks; + public SavedGamesSet saves; //For simulations. @@ -135,6 +138,7 @@ public class Project implements ProjectTreeNode, Serializable { alteredContent = new GameSource(this, GameSource.Type.altered); createdContent = new GameSource(this, GameSource.Type.created); + bookmarks = new BookmarksRoot(this); saves = new SavedGamesSet(this); @@ -143,6 +147,7 @@ public class Project implements ProjectTreeNode, Serializable { // v.add(referencedContent); v.add(baseContent); v.add(saves); + v.add(bookmarks); linkAll(); @@ -262,6 +267,7 @@ public class Project implements ProjectTreeNode, Serializable { // referencedContent.refreshTransients(this); alteredContent = new GameSource(this, GameSource.Type.altered); createdContent = new GameSource(this, GameSource.Type.created); + bookmarks = new BookmarksRoot(this); saves.refreshTransients(); @@ -271,6 +277,7 @@ public class Project implements ProjectTreeNode, Serializable { // v.add(referencedContent); v.add(baseContent); v.add(saves); + v.add(bookmarks); linkAll(); @@ -970,6 +977,10 @@ public class Project implements ProjectTreeNode, Serializable { fireElementAdded(node, getNodeIndex(node)); } + public void bookmark(GameDataElement gde) { + bookmarks.addBookmark(gde); + } + @Override public GameDataSet getDataSet() { diff --git a/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkEntry.java b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkEntry.java new file mode 100644 index 0000000..17f811d --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkEntry.java @@ -0,0 +1,155 @@ +package com.gpl.rpg.atcontentstudio.model.bookmarks; + +import java.awt.Image; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import javax.swing.tree.TreeNode; + +import com.gpl.rpg.atcontentstudio.model.GameDataElement; +import com.gpl.rpg.atcontentstudio.model.GameSource.Type; +import com.gpl.rpg.atcontentstudio.model.Project; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet; +import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; +import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage; + +public class BookmarkEntry implements BookmarkNode { + + public GameDataElement bookmarkedElement; + public BookmarkFolder parent; + + public BookmarkEntry(BookmarkFolder parent, GameDataElement target) { + this.parent = parent; + this.bookmarkedElement = target; + target.bookmark = this; + parent.contents.add(this); + } + + @Override + public Enumeration children() { + return null; + } + + @Override + public boolean getAllowsChildren() { + return false; + } + + @Override + public TreeNode getChildAt(int childIndex) { + return null; + } + + @Override + public int getChildCount() { + return 0; + } + + @Override + public int getIndex(TreeNode node) { + return 0; + } + + @Override + public TreeNode getParent() { + return parent; + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public void childrenAdded(List path) { + path.add(0,this); + parent.childrenAdded(path); + } + + @Override + public void childrenChanged(List path) { + path.add(0,this); + parent.childrenChanged(path); + } + + @Override + public void childrenRemoved(List path) { + path.add(0,this); + parent.childrenRemoved(path); + } + @Override + public void notifyCreated() { + childrenAdded(new ArrayList()); + } + + @Override + public String getDesc() { + if (bookmarkedElement instanceof QuestStage) { + String text = ((GameDataElement)bookmarkedElement).getDesc(); + if (text.length() > 60) { + text = text.substring(0, 57)+"..."; + } + return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((Quest)((QuestStage)bookmarkedElement).parent).id+"#"+((QuestStage)bookmarkedElement).progress+":"+text; + } else { + return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((GameDataElement)bookmarkedElement).getDesc(); + } + } + + @Override + public Project getProject() { + return parent.getProject(); + } + + @Override + public GameDataSet getDataSet() { + return null; + } + + @Override + public Image getIcon() { + return bookmarkedElement.getIcon(); + } + + @Override + public Image getOpenIcon() { + return null; + } + + @Override + public Image getClosedIcon() { + return null; + } + + @Override + public Image getLeafIcon() { + return getIcon(); + } + + @Override + public Type getDataType() { + return null; + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public boolean needsSaving() { + return false; + } + + public void delete() { + bookmarkedElement.bookmark = null; + parent.delete(this); + } + + @Override + public void save() { + parent.save(); + } + +} diff --git a/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkFolder.java b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkFolder.java new file mode 100644 index 0000000..c34be73 --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkFolder.java @@ -0,0 +1,168 @@ +package com.gpl.rpg.atcontentstudio.model.bookmarks; + +import java.awt.Image; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedList; +import java.util.List; + +import javax.swing.tree.TreeNode; + +import com.gpl.rpg.atcontentstudio.model.GameSource.Type; +import com.gpl.rpg.atcontentstudio.model.Project; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet; +import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; + +public class BookmarkFolder implements BookmarkNode { + + List contents = new LinkedList(); + BookmarkNode parent; + String name; + Image closedIcon, openIcon; + + public BookmarkFolder(BookmarkNode parent, String name) { + this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon()); + } + + public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) { + this.parent = parent; + this.name = name; + this.closedIcon = closedIcon; + this.openIcon = openIcon; + } + + @Override + public Enumeration children() { + return Collections.enumeration(contents); + } + + @Override + public boolean getAllowsChildren() { + return true; + } + + @Override + public TreeNode getChildAt(int childIndex) { + return contents.get(childIndex); + } + + @Override + public int getChildCount() { + return contents.size(); + } + + @Override + public int getIndex(TreeNode node) { + return contents.indexOf(node); + } + + @Override + public TreeNode getParent() { + return parent; + } + + @Override + public boolean isLeaf() { + return false; + } + + @Override + public void childrenAdded(List path) { + path.add(0,this); + parent.childrenAdded(path); + } + + @Override + public void childrenChanged(List path) { + path.add(0,this); + parent.childrenChanged(path); + } + + @Override + public void childrenRemoved(List path) { + if (path.size() == 1 && this.getChildCount() == 1) { + childrenRemoved(new ArrayList()); + } else { + path.add(0, this); + parent.childrenRemoved(path); + } + } + @Override + public void notifyCreated() { + childrenAdded(new ArrayList()); + } + + @Override + public String getDesc() { + return name; + } + + @Override + public Project getProject() { + return parent.getProject(); + } + + @Override + public GameDataSet getDataSet() { + return null; + } + + @Override + public Image getIcon() { + return getClosedIcon(); + } + + @Override + public Image getOpenIcon() { + return openIcon; + } + + @Override + public Image getClosedIcon() { + return closedIcon; + } + + @Override + public Image getLeafIcon() { + return getClosedIcon(); + } + + @Override + public Type getDataType() { + return null; + } + + @Override + public boolean isEmpty() { + return contents.isEmpty(); + } + + @Override + public boolean needsSaving() { + return false; + } + + public void delete(BookmarkEntry bookmarkEntry) { + if (contents.contains(bookmarkEntry)) { + bookmarkEntry.childrenRemoved(new ArrayList()); + contents.remove(bookmarkEntry); + save(); + } + } + + public void delete(BookmarkFolder bookmarkFolder) { + // TODO Auto-generated method stub + + } + + public void save() { + parent.save(); + } + + public void delete() { + + } + +} diff --git a/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkNode.java b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkNode.java new file mode 100644 index 0000000..4b64420 --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarkNode.java @@ -0,0 +1,10 @@ +package com.gpl.rpg.atcontentstudio.model.bookmarks; + +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; + +public interface BookmarkNode extends ProjectTreeNode{ + + public void save(); + public void delete(); + +} diff --git a/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarksRoot.java b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarksRoot.java new file mode 100644 index 0000000..501cfff --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/model/bookmarks/BookmarksRoot.java @@ -0,0 +1,210 @@ +package com.gpl.rpg.atcontentstudio.model.bookmarks; + +import java.awt.Image; +import java.io.File; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import javax.swing.tree.TreeNode; + +import com.gpl.rpg.atcontentstudio.model.GameDataElement; +import com.gpl.rpg.atcontentstudio.model.GameSource.Type; +import com.gpl.rpg.atcontentstudio.model.Project; +import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; +import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection; +import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition; +import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue; +import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist; +import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet; +import com.gpl.rpg.atcontentstudio.model.gamedata.Item; +import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory; +import com.gpl.rpg.atcontentstudio.model.gamedata.NPC; +import com.gpl.rpg.atcontentstudio.model.gamedata.Quest; +import com.gpl.rpg.atcontentstudio.model.maps.TMXMap; +import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment; +import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; +import com.gpl.rpg.atcontentstudio.ui.DefaultIcons; + +public class BookmarksRoot implements BookmarkNode { + + SavedSlotCollection v = new SavedSlotCollection(); + + public transient Project parent = null; + + BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm; + + public BookmarksRoot(Project parent) { + this.parent = parent; + + v.add(ac = new BookmarkFolder(this, ActorCondition.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(diag = new BookmarkFolder(this, Dialogue.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(dl = new BookmarkFolder(this, Droplist.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(it = new BookmarkFolder(this, Item.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(ic = new BookmarkFolder(this, ItemCategory.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(npc = new BookmarkFolder(this, NPC.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + v.add(q = new BookmarkFolder(this, Quest.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon())); + + v.add(tmx = new BookmarkFolder(this, "TMX Maps", DefaultIcons.getTmxClosedIcon(), DefaultIcons.getTmxOpenIcon())); + v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon())); + v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon())); + } + + @Override + public Enumeration children() { + return v.getNonEmptyElements(); + } + + @Override + public boolean getAllowsChildren() { + return true; + } + + @Override + public TreeNode getChildAt(int arg0) { + return v.getNonEmptyElementAt(arg0); + } + + @Override + public int getChildCount() { + return v.getNonEmptySize(); + } + + @Override + public int getIndex(TreeNode arg0) { + return v.getNonEmptyIndexOf((ProjectTreeNode) arg0); + } + + @Override + public TreeNode getParent() { + return parent; + } + + @Override + public boolean isLeaf() { + return false; + } + + @Override + public void childrenAdded(List path) { + path.add(0, this); + parent.childrenAdded(path); + } + @Override + public void childrenChanged(List path) { + path.add(0, this); + parent.childrenChanged(path); + } + @Override + public void childrenRemoved(List path) { + if (path.size() == 1 && this.v.getNonEmptySize() == 1) { + childrenRemoved(new ArrayList()); + } else { + path.add(0, this); + parent.childrenRemoved(path); + } + } + @Override + public void notifyCreated() { + childrenAdded(new ArrayList()); + for (ProjectTreeNode node : v.getNonEmptyIterable()) { + node.notifyCreated(); + } + } + + @Override + public String getDesc() { + return (needsSaving() ? "*" : "")+"Bookmarks"; + } + + @Override + public Project getProject() { + return parent == null ? null : parent.getProject(); + } + + @Override + public GameDataSet getDataSet() { + return null; + } + + @Override + public Image getIcon() { + return getOpenIcon(); + } + + @Override + public Image getOpenIcon() { + return DefaultIcons.getBookmarkOpenIcon(); + } + + @Override + public Image getClosedIcon() { + return DefaultIcons.getBookmarkClosedIcon(); + } + + @Override + public Image getLeafIcon() { + return getClosedIcon(); + } + + @Override + public Type getDataType() { + return null; + } + + @Override + public boolean isEmpty() { + return v.isEmpty(); + } + + @Override + public boolean needsSaving() { + return false; + } + + public void save() { + + } + + @Override + public void delete() {} + + public void addBookmark(GameDataElement target) { + BookmarkEntry node; + BookmarkFolder folder = null; + if (target instanceof ActorCondition) { + folder = ac; + } else if (target instanceof Dialogue) { + folder = diag; + } else if (target instanceof Droplist) { + folder = dl; + } else if (target instanceof Item) { + folder = it; + } else if (target instanceof ItemCategory) { + folder = ic; + } else if (target instanceof NPC) { + folder = npc; + } else if (target instanceof Quest) { + folder = q; + } else if (target instanceof TMXMap) { + folder = tmx; + } else if (target instanceof Spritesheet) { + folder = sp; + } else if (target instanceof WorldmapSegment) { + folder = wm; + } else { + return; + } + ProjectTreeNode higherEmptyParent = folder; + while (higherEmptyParent != null) { + if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent(); + else break; + } + if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null; + + node = new BookmarkEntry(folder, target); + if (higherEmptyParent != null) higherEmptyParent.notifyCreated(); + else node.notifyCreated(); + } + +} diff --git a/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java b/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java index 2035460..fd29106 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/DefaultIcons.java @@ -75,6 +75,14 @@ public class DefaultIcons { private static String FOLDER_AT_OPEN_RES = "/com/gpl/rpg/atcontentstudio/img/folder_at_open.png"; public static Image getATOpenImage() { return getImage(FOLDER_AT_OPEN_RES); } public static Image getATOpenIcon() { return getIcon(FOLDER_AT_OPEN_RES); } + + private static String FOLDER_BOOKMARK_CLOSED_RES = "/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png"; + public static Image getBookmarkClosedImage() { return getImage(FOLDER_BOOKMARK_CLOSED_RES); } + public static Image getBookmarkClosedIcon() { return getIcon(FOLDER_BOOKMARK_CLOSED_RES); } + + private static String FOLDER_BOOKMARK_OPEN_RES = "/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png"; + public static Image getBookmarkOpenImage() { return getImage(FOLDER_BOOKMARK_OPEN_RES); } + public static Image getBookmarkOpenIcon() { return getIcon(FOLDER_BOOKMARK_OPEN_RES); } private static String TILED_ICON_RES = "/com/gpl/rpg/atcontentstudio/img/tiled-icon.png"; public static Image getTiledIconImage() { return getImage(TILED_ICON_RES); } @@ -276,6 +284,14 @@ public class DefaultIcons { public static Image getStatusUnknownImage() { return getImage(STATUS_UNKNOWN_RES); } public static Image getStatusUnknownIcon() { return getIcon(STATUS_UNKNOWN_RES); } + private static String BOOKMARK_INACTIVE = "/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png"; + public static Image getBookmarkInactiveImage() { return getImage(BOOKMARK_INACTIVE); } + public static Image getBookmarkInactiveIcon() { return getIcon(BOOKMARK_INACTIVE); } + + private static String BOOKMARK_ACTIVE = "/com/gpl/rpg/atcontentstudio/img/bookmark_active.png"; + public static Image getBookmarkActiveImage() { return getImage(BOOKMARK_ACTIVE); } + public static Image getBookmarkActiveIcon() { return getIcon(BOOKMARK_ACTIVE); } + private static Image getImage(String res) { if (imageCache.get(res) == null) { diff --git a/src/com/gpl/rpg/atcontentstudio/ui/Editor.java b/src/com/gpl/rpg/atcontentstudio/ui/Editor.java index d40be0a..edb5912 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/Editor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/Editor.java @@ -812,7 +812,7 @@ public abstract class Editor extends JPanel implements ProjectElementListener { if (text.length() > 60) { text = text.substring(0, 57)+"..."; } - label.setText(((GameDataElement)value).getDataType().toString()+"/"+((Quest)((QuestStage)value).parent).id+":"+text); + label.setText(((GameDataElement)value).getDataType().toString()+"/"+((Quest)((QuestStage)value).parent).id+"#"+((QuestStage)value).progress+":"+text); } else { label.setText(((GameDataElement)value).getDataType().toString()+"/"+((GameDataElement)value).getDesc()); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/ProjectsTree.java b/src/com/gpl/rpg/atcontentstudio/ui/ProjectsTree.java index 577ba15..0d8148b 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/ProjectsTree.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/ProjectsTree.java @@ -33,6 +33,7 @@ import com.gpl.rpg.andorstrainer.AndorsTrainer; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; import com.gpl.rpg.atcontentstudio.model.Workspace; +import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarkEntry; import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement; import com.gpl.rpg.atcontentstudio.model.maps.TMXMap; import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment; @@ -595,6 +596,8 @@ public class ProjectsTree extends JPanel { ATContentStudio.frame.openEditor((WorldmapSegment)node); } else if (node instanceof WriterModeData) { ATContentStudio.frame.openEditor((WriterModeData)node); + } else if (node instanceof BookmarkEntry) { + ATContentStudio.frame.openEditor(((BookmarkEntry)node).bookmarkedElement); } else if (node instanceof SavedGame) { if (konamiCodeEntered) { ATContentStudio.frame.openEditor((SavedGame)node); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/StudioFrame.java b/src/com/gpl/rpg/atcontentstudio/ui/StudioFrame.java index 2af28da..25ccaa5 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/StudioFrame.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/StudioFrame.java @@ -213,6 +213,8 @@ public class StudioFrame extends JFrame { openEditor((Spritesheet) node); } else if (node instanceof TMXMap) { openEditor((TMXMap) node); + } else if (node instanceof WorldmapSegment) { + openEditor((WorldmapSegment) node); } else if (node instanceof WriterModeData) { openEditor((WriterModeData) node); } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/JSONElementEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/JSONElementEditor.java index c70b5e8..e313805 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/JSONElementEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/JSONElementEditor.java @@ -204,6 +204,7 @@ public abstract class JSONElementEditor extends Editor { } }); savePane.add(delete, JideBoxLayout.FIX); + } else { if (proj.alteredContent.gameData.getGameDataElement(concreteNodeClass, node.id) != null) { savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX); @@ -242,8 +243,10 @@ public abstract class JSONElementEditor extends Editor { } JButton prev = new JButton(new ImageIcon(DefaultIcons.getArrowLeftIcon())); JButton next = new JButton(new ImageIcon(DefaultIcons.getArrowRightIcon())); + final JButton bookmark = new JButton(new ImageIcon(node.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon())); savePane.add(prev, JideBoxLayout.FIX); savePane.add(next, JideBoxLayout.FIX); + savePane.add(bookmark, JideBoxLayout.FIX); if (node.getParent().getIndex(node) == 0) { prev.setEnabled(false); } @@ -268,6 +271,20 @@ public abstract class JSONElementEditor extends Editor { } } }); + bookmark.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + if (node.bookmark == null) { + node.getProject().bookmark(node); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon())); + } else { + node.bookmark.delete(); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon())); + } + } + }); + + //Placeholder. Fills the eventual remaining space. savePane.add(new JPanel(), JideBoxLayout.VARY); pane.add(savePane, JideBoxLayout.FIX); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 945da13..edf68a8 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -1779,6 +1779,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } }); savePane.add(delete, JideBoxLayout.FIX); + final JButton bookmark = new JButton(new ImageIcon(map.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon())); + savePane.add(bookmark, JideBoxLayout.FIX); + bookmark.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + if (map.bookmark == null) { + map.getProject().bookmark(map); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon())); + } else { + map.bookmark.delete(); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon())); + } + } + }); } else { if (proj.getMap(map.id) != map) { savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX); @@ -1842,6 +1856,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe } } }); + final JButton bookmark = new JButton(new ImageIcon(map.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon())); + savePane.add(bookmark, JideBoxLayout.FIX); + bookmark.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + if (map.bookmark == null) { + map.getProject().bookmark(map); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon())); + } else { + map.bookmark.delete(); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon())); + } + } + }); //Placeholder. Fills the eventual remaining space. savePane.add(new JPanel(), JideBoxLayout.VARY); pane.add(savePane, JideBoxLayout.FIX); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapEditor.java index bdcdf17..7e1afdd 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapEditor.java @@ -986,6 +986,20 @@ public class WorldMapEditor extends Editor implements FieldUpdateListener { } } }); + final JButton bookmark = new JButton(new ImageIcon(node.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon())); + savePane.add(bookmark, JideBoxLayout.FIX); + bookmark.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + if (node.bookmark == null) { + node.getProject().bookmark(node); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon())); + } else { + node.bookmark.delete(); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon())); + } + } + }); //Placeholder. Fills the eventual remaining space. savePane.add(new JPanel(), JideBoxLayout.VARY); return savePane; diff --git a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java index 89692e5..d3f9a3f 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpritesheetEditor.java @@ -100,6 +100,20 @@ public class SpritesheetEditor extends Editor { }); buttonPane.add(openImage, JideBoxLayout.FIX); buttonPane.add(getWarningLabel(), JideBoxLayout.FIX); + final JButton bookmark = new JButton(new ImageIcon(sheet.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon())); + buttonPane.add(bookmark, JideBoxLayout.FIX); + bookmark.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + if (target.bookmark == null) { + target.getProject().bookmark(target); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon())); + } else { + target.bookmark.delete(); + bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon())); + } + } + }); buttonPane.add(new JPanel(), JideBoxLayout.VARY); pane.add(buttonPane, JideBoxLayout.FIX); addLabelField(pane, "Spritesheet ID: ", sheet.id);