Refactor out swing-related code from forge-gui into new forge-gui-desktop module

This commit is contained in:
drdev
2014-04-08 23:01:39 +00:00
parent 18dd421935
commit 9439bbbc57
535 changed files with 31219 additions and 19307 deletions

866
.gitattributes vendored
View File

@@ -187,7 +187,6 @@ forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java svneol=n
forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java -text
forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java -text
forge-core/src/main/java/forge/deck/generation/DeckGeneratorTheme.java -text
forge-core/src/main/java/forge/deck/generation/package-info.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/io/DeckFileHeader.java -text
forge-core/src/main/java/forge/deck/io/DeckGroupSerializer.java -text
@@ -630,6 +629,397 @@ forge-game/src/main/java/forge/game/zone/package-info.java svneol=native#text/pl
forge-game/src/main/java/forge/package-info.java -text
forge-game/src/main/java/forge/util/Expressions.java -text
forge-game/src/main/java/forge/util/package-info.java -text
forge-gui-desktop/.classpath -text
forge-gui-desktop/.project -text
forge-gui-desktop/.settings/org.eclipse.core.resources.prefs -text
forge-gui-desktop/.settings/org.eclipse.jdt.core.prefs -text
forge-gui-desktop/.settings/org.eclipse.m2e.core.prefs -text
forge-gui-desktop/pom.xml -text
forge-gui-desktop/src/main/config/Forge.icns -text
forge-gui-desktop/src/main/config/appbundler-1.0-custom.jar -text
forge-gui-desktop/src/main/config/backgroundImage.jpg -text
forge-gui-desktop/src/main/config/builder/create-dmg.builder -text
forge-gui-desktop/src/main/config/create-dmg -text
forge-gui-desktop/src/main/config/forge.command -text
forge-gui-desktop/src/main/config/forge.ico -text
forge-gui-desktop/src/main/config/forge.sh -text
forge-gui-desktop/src/main/config/forge_checks.xml -text
forge-gui-desktop/src/main/config/support/dmg-license.py -text
forge-gui-desktop/src/main/config/support/template.applescript -text
forge-gui-desktop/src/main/html/connectionTest.html -text
forge-gui-desktop/src/main/html/css/core.css -text
forge-gui-desktop/src/main/html/js/jquery/jquery-1.9.1.js -text
forge-gui-desktop/src/main/html/js/jquery/jquery-1.9.1.min.js -text
forge-gui-desktop/src/main/html/js/observable.js -text
forge-gui-desktop/src/main/html/js/socket.js -text
forge-gui-desktop/src/main/java/forge/GuiDesktop.java -text
forge-gui-desktop/src/main/java/forge/ImageCache.java -text
forge-gui-desktop/src/main/java/forge/ImageLoader.java -text
forge-gui-desktop/src/main/java/forge/Singletons.java -text
forge-gui-desktop/src/main/java/forge/control/FControl.java -text
forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java -text
forge-gui-desktop/src/main/java/forge/control/RestartUtil.java -text
forge-gui-desktop/src/main/java/forge/control/package-info.java -text
forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java -text
forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBoxEvent.java -text
forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java -text
forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java -text
forge-gui-desktop/src/main/java/forge/deckchooser/IDecksComboBoxListener.java -text
forge-gui-desktop/src/main/java/forge/download/GuiDownloadPicturesLQ.java -text
forge-gui-desktop/src/main/java/forge/download/GuiDownloadPrices.java -text
forge-gui-desktop/src/main/java/forge/download/GuiDownloadQuestImages.java -text
forge-gui-desktop/src/main/java/forge/download/GuiDownloadSetPicturesLQ.java -text
forge-gui-desktop/src/main/java/forge/download/GuiDownloader.java -text
forge-gui-desktop/src/main/java/forge/download/package-info.java -text
forge-gui-desktop/src/main/java/forge/error/BugReporter.java -text
forge-gui-desktop/src/main/java/forge/error/package-info.java -text
forge-gui-desktop/src/main/java/forge/gui/CardContainer.java -text
forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java -text
forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java -text
forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java -text
forge-gui-desktop/src/main/java/forge/gui/DualListBox.java -text
forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java -text
forge-gui-desktop/src/main/java/forge/gui/ForgeAction.java -text
forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java -text
forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java -text
forge-gui-desktop/src/main/java/forge/gui/GuiProgressBarWindow.java -text
forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java -text
forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java -text
forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java -text
forge-gui-desktop/src/main/java/forge/gui/ListChooser.java -text
forge-gui-desktop/src/main/java/forge/gui/MouseUtil.java -text
forge-gui-desktop/src/main/java/forge/gui/MultiLineLabel.java -text
forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java -text
forge-gui-desktop/src/main/java/forge/gui/SOverlayUtils.java -text
forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java -text
forge-gui-desktop/src/main/java/forge/gui/WrapLayout.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/CEmptyDoc.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/DragTab.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/ICDoc.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/IDocIdList.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/ILocalRepaint.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/IVDoc.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/IVTopLevelUI.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/InvalidLayoutFileException.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/RectangleOfDouble.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SDisplayUtil.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutConstants.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SOverflowUtil.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/VEmptyDoc.java -text
forge-gui-desktop/src/main/java/forge/gui/framework/package-info.java -text
forge-gui-desktop/src/main/java/forge/gui/package-info.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/ItemManagerContainer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/SpellShopManager.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCRangeFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardColorFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardFormatFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardPowerFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardToughnessFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckColorFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFormatFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSearchFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckStatTypeFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ItemFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ValueRangeFilter.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/package-info.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ColorSetRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/DeckQuantityRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/DeckStarRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/IntegerRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemCellRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemTableColumn.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/ManaCostRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/SColumnUtil.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/SetCodeRenderer.java -text
forge-gui-desktop/src/main/java/forge/itemmanager/views/StarRenderer.java -text
forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java -text
forge-gui-desktop/src/main/java/forge/menus/HelpMenu.java -text
forge-gui-desktop/src/main/java/forge/menus/IMenuProvider.java -text
forge-gui-desktop/src/main/java/forge/menus/LayoutMenu.java -text
forge-gui-desktop/src/main/java/forge/menus/MenuUtil.java -text
forge-gui-desktop/src/main/java/forge/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/bazaar/CBazaarUI.java -text
forge-gui-desktop/src/main/java/forge/screens/bazaar/VBazaarUI.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/SEditorIO.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/VDeckEditorUI.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CAllDecks.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCardCatalog.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCurrentDeck.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CDeckgen.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorDraftingProcess.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatistics.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/DeckFileMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCardCatalog.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCurrentDeck.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VDeckgen.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VProbabilities.java -text
forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VStatistics.java -text
forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java -text
forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java -text
forge-gui-desktop/src/main/java/forge/screens/home/EMenuItem.java -text
forge-gui-desktop/src/main/java/forge/screens/home/IVSubmenu.java -text
forge-gui-desktop/src/main/java/forge/screens/home/LblGroup.java -text
forge-gui-desktop/src/main/java/forge/screens/home/LblHeader.java -text
forge-gui-desktop/src/main/java/forge/screens/home/LblMenuItem.java -text
forge-gui-desktop/src/main/java/forge/screens/home/PnlGroup.java -text
forge-gui-desktop/src/main/java/forge/screens/home/StartButton.java -text
forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletContests.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletLoad.java -text
forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java -text
forge-gui-desktop/src/main/java/forge/screens/home/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestDecks.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestPrefs.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/IVQuestStats.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestPreferencesHandler.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/SSubmenuQuestUtil.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuDuels.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestDecks.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestPrefs.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java -text
forge-gui-desktop/src/main/java/forge/screens/home/quest/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/ConstructedGameMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java -text
forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuAvatars.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuDownloaders.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuReleaseNotes.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAvatars.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java -text
forge-gui-desktop/src/main/java/forge/screens/home/settings/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java -text
forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java -text
forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java -text
forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java -text
forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java -text
forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java -text
forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java -text
forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java -text
forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java -text
forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java -text
forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java -text
forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CAntes.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CLog.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPlayers.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java -text
forge-gui-desktop/src/main/java/forge/screens/match/controllers/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/match/menus/CMatchUIMenus.java -text
forge-gui-desktop/src/main/java/forge/screens/match/menus/CardOverlaysMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/match/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VDetail.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VDev.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VDock.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VPicture.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java -text
forge-gui-desktop/src/main/java/forge/screens/match/views/package-info.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/CWorkshopUI.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/VWorkshopUI.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/controllers/CCardDesigner.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/controllers/CCardScript.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/controllers/CWorkshopCatalog.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/menus/WorkshopFileMenu.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardDesigner.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardScript.java -text
forge-gui-desktop/src/main/java/forge/screens/workshop/views/VWorkshopCatalog.java -text
forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java -text
forge-gui-desktop/src/main/java/forge/toolbox/ContextMenuBuilder.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FAbsolutePositioner.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FButton.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FCheckBox.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FComboBox.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FHtmlViewer.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FHyperlink.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FList.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FMouseAdapter.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FOverlay.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FProgressBar.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FRadioButton.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FScrollPane.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FScrollPanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FSpinner.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FTabbedPane.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FTextArea.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FTextEditor.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FTextField.java -text
forge-gui-desktop/src/main/java/forge/toolbox/FUndoManager.java -text
forge-gui-desktop/src/main/java/forge/toolbox/IDisposable.java -text
forge-gui-desktop/src/main/java/forge/toolbox/JXButtonPanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/LayoutHelper.java -text
forge-gui-desktop/src/main/java/forge/toolbox/SaveOpenDialog.java -text
forge-gui-desktop/src/main/java/forge/toolbox/SmartScroller.java -text
forge-gui-desktop/src/main/java/forge/toolbox/ToolTipListener.java -text
forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java -text
forge-gui-desktop/src/main/java/forge/toolbox/package-info.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/PhaseIndicator.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/PhaseLabel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java -text
forge-gui-desktop/src/main/java/forge/toolbox/special/package-info.java -text
forge-gui-desktop/src/main/java/forge/view/ButtonUtil.java -text
forge-gui-desktop/src/main/java/forge/view/FDialog.java -text
forge-gui-desktop/src/main/java/forge/view/FFrame.java -text
forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java -text
forge-gui-desktop/src/main/java/forge/view/FTitleBar.java -text
forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java -text
forge-gui-desktop/src/main/java/forge/view/FView.java -text
forge-gui-desktop/src/main/java/forge/view/ITitleBarOwner.java -text
forge-gui-desktop/src/main/java/forge/view/Main.java -text
forge-gui-desktop/src/main/java/forge/view/SplashFrame.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/HandArea.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/ViewPanel.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/package-info.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/util/Animation.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/util/CardPanelMouseAdapter.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/util/CardPanelMouseListener.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/util/OutlinedLabel.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/util/package-info.java -text
forge-gui-desktop/src/main/java/forge/view/package-info.java -text
forge-gui-desktop/src/site/apt/index.apt -text
forge-gui-desktop/src/test/java/forge/BoosterDraft1Test.java -text
forge-gui-desktop/src/test/java/forge/BoosterDraftTest.java -text
forge-gui-desktop/src/test/java/forge/GuiDownloadPicturesLQTest.java -text
forge-gui-desktop/src/test/java/forge/GuiDownloadSetPicturesLQTest.java -text
forge-gui-desktop/src/test/java/forge/GuiProgressBarWindowTest.java -text
forge-gui-desktop/src/test/java/forge/PanelTest.java -text
forge-gui-desktop/src/test/java/forge/RunTest.java -text
forge-gui-desktop/src/test/java/forge/TinyTest.java -text
forge-gui-desktop/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java -text
forge-gui-desktop/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java -text
forge-gui-desktop/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/BaseGameSimulationTest.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/comprehensiverules/ComprehensiveRulesSection103.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/comprehensiverules/ComprehensiveRulesSection104.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/IntegerConstraint.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/Specification.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/card/CardSpecification.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/card/CardSpecificationBuilder.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/card/CardSpecificationHandler.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecification.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecification.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecificationBuilder.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecificationHandler.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/ActionPreCondition.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/ActivateAbilityAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/BasePlayerAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/CastSpellFromHandAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareBlockersAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/AssertAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/CardAssertAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/EndTestAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/PlayerAssertAction.java -text
forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/TestAction.java -text
forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java -text
forge-gui-desktop/src/test/java/forge/gui/game/CardDetailPanelTest.java -text
forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java -text
forge-gui-desktop/src/test/java/forge/model/FModelTest.java -text
forge-gui/.classpath -text
forge-gui/.project -text
forge-gui/.settings/org.eclipse.core.resources.prefs -text
@@ -15549,350 +15939,51 @@ forge-gui/src/main/html/js/jquery/jquery-1.9.1.min.js -text
forge-gui/src/main/html/js/observable.js -text
forge-gui/src/main/html/js/socket.js -text
forge-gui/src/main/java/forge/FThreads.java -text
forge-gui/src/main/java/forge/ImageCache.java svneol=native#text/plain
forge-gui/src/main/java/forge/ImageLoader.java -text
forge-gui/src/main/java/forge/Singletons.java svneol=native#text/plain
forge-gui/src/main/java/forge/GuiBase.java -text
forge-gui/src/main/java/forge/SGuiChoose.java -text
forge-gui/src/main/java/forge/SGuiDialog.java -text
forge-gui/src/main/java/forge/SOptionPane.java -text
forge-gui/src/main/java/forge/UiCommand.java svneol=native#text/plain
forge-gui/src/main/java/forge/assets/FSkinProp.java -text
forge-gui/src/main/java/forge/assets/ISkinImage.java -text
forge-gui/src/main/java/forge/assets/ImageUtil.java -text
forge-gui/src/main/java/forge/card/CardPreferences.java -text
forge-gui/src/main/java/forge/card/CardReaderExperiments.java -text
forge-gui/src/main/java/forge/card/CardScriptInfo.java -text
forge-gui/src/main/java/forge/control/ChatArea.java -text
forge-gui/src/main/java/forge/control/FControl.java -text
forge-gui/src/main/java/forge/control/FControlGameEventHandler.java -text
forge-gui/src/main/java/forge/control/FControlGamePlayback.java -text
forge-gui/src/main/java/forge/control/InputQueue.java svneol=native#text/plain
forge-gui/src/main/java/forge/control/KeyboardShortcuts.java -text
forge-gui/src/main/java/forge/control/RestartUtil.java -text
forge-gui/src/main/java/forge/control/package-info.java -text
forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java -text
forge-gui/src/main/java/forge/deck/DeckProxy.java -text
forge-gui/src/main/java/forge/deck/DeckType.java -text
forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java -text
forge-gui/src/main/java/forge/deck/io/DeckPreferences.java -text
forge-gui/src/main/java/forge/deck/io/OldDeckParser.java -text
forge-gui/src/main/java/forge/deck/io/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/error/ExceptionHandler.java svneol=native#text/plain
forge-gui/src/main/java/forge/error/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/events/IUiEventVisitor.java -text
forge-gui/src/main/java/forge/events/UiEvent.java -text
forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java -text
forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java -text
forge-gui/src/main/java/forge/gauntlet/GauntletData.java -text
forge-gui/src/main/java/forge/gauntlet/GauntletIO.java -text
forge-gui/src/main/java/forge/gui/CardContainer.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/CardDetailPanel.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/CardListViewer.java -text
forge-gui/src/main/java/forge/gui/CardPicturePanel.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/CardPreferences.java -text
forge-gui/src/main/java/forge/gui/DualListBox.java -text
forge-gui/src/main/java/forge/gui/FNetOverlay.java -text
forge-gui/src/main/java/forge/gui/ForgeAction.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/GuiChoose.java -text
forge-gui/src/main/java/forge/gui/GuiDialog.java -text
forge-gui/src/main/java/forge/gui/GuiDisplayUtil.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/GuiProgressBarWindow.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/GuiUtils.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/InputProxy.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/ListChooser.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/MouseUtil.java -text
forge-gui/src/main/java/forge/gui/MultiLineLabel.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/MultiLineLabelUI.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/SOverlayUtils.java -text
forge-gui/src/main/java/forge/gui/UnsortedListModel.java -text
forge-gui/src/main/java/forge/gui/WrapLayout.java -text
forge-gui/src/main/java/forge/gui/bazaar/CBazaarUI.java -text
forge-gui/src/main/java/forge/gui/bazaar/VBazaarUI.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text
forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text
forge-gui/src/main/java/forge/gui/deckchooser/FDeckViewer.java -text
forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text
forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text
forge-gui/src/main/java/forge/gui/deckeditor/DeckImport.java -text
forge-gui/src/main/java/forge/gui/deckeditor/DeckProxy.java -text
forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java -text
forge-gui/src/main/java/forge/gui/deckeditor/VDeckEditorUI.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/ACEditorBase.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CAllDecks.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CDeckgen.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorCommander.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CProbabilities.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/CStatistics.java -text
forge-gui/src/main/java/forge/gui/deckeditor/controllers/DeckController.java -text
forge-gui/src/main/java/forge/gui/deckeditor/menus/CDeckEditorUIMenus.java -text
forge-gui/src/main/java/forge/gui/deckeditor/menus/DeckFileMenu.java -text
forge-gui/src/main/java/forge/gui/deckeditor/package-info.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VAllDecks.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VDeckgen.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VProbabilities.java -text
forge-gui/src/main/java/forge/gui/deckeditor/views/VStatistics.java -text
forge-gui/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/download/GuiDownloadPrices.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/download/GuiDownloadQuestImages.java -text
forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/download/GuiDownloader.java -text
forge-gui/src/main/java/forge/gui/download/package-info.java -text
forge-gui/src/main/java/forge/gui/events/IUiEventVisitor.java -text
forge-gui/src/main/java/forge/gui/events/UiEvent.java -text
forge-gui/src/main/java/forge/gui/events/UiEventAttackerDeclared.java -text
forge-gui/src/main/java/forge/gui/events/UiEventBlockerAssigned.java -text
forge-gui/src/main/java/forge/gui/framework/CEmptyDoc.java -text
forge-gui/src/main/java/forge/gui/framework/DragCell.java -text
forge-gui/src/main/java/forge/gui/framework/DragTab.java -text
forge-gui/src/main/java/forge/gui/framework/EDocID.java -text
forge-gui/src/main/java/forge/gui/framework/FScreen.java -text
forge-gui/src/main/java/forge/gui/framework/ICDoc.java -text
forge-gui/src/main/java/forge/gui/framework/IDocIdList.java -text
forge-gui/src/main/java/forge/gui/framework/ILocalRepaint.java -text
forge-gui/src/main/java/forge/gui/framework/IVDoc.java -text
forge-gui/src/main/java/forge/gui/framework/IVTopLevelUI.java -text
forge-gui/src/main/java/forge/gui/framework/InvalidLayoutFileException.java -text
forge-gui/src/main/java/forge/gui/framework/RectangleOfDouble.java -text
forge-gui/src/main/java/forge/gui/framework/SDisplayUtil.java -text
forge-gui/src/main/java/forge/gui/framework/SLayoutConstants.java -text
forge-gui/src/main/java/forge/gui/framework/SLayoutIO.java -text
forge-gui/src/main/java/forge/gui/framework/SOverflowUtil.java -text
forge-gui/src/main/java/forge/gui/framework/SRearrangingUtil.java -text
forge-gui/src/main/java/forge/gui/framework/SResizingUtil.java -text
forge-gui/src/main/java/forge/gui/framework/VEmptyDoc.java -text
forge-gui/src/main/java/forge/gui/framework/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/home/CHomeUI.java -text
forge-gui/src/main/java/forge/gui/home/EMenuGroup.java -text
forge-gui/src/main/java/forge/gui/home/EMenuItem.java -text
forge-gui/src/main/java/forge/gui/home/IVSubmenu.java -text
forge-gui/src/main/java/forge/gui/home/LblGroup.java -text
forge-gui/src/main/java/forge/gui/home/LblHeader.java -text
forge-gui/src/main/java/forge/gui/home/LblMenuItem.java -text
forge-gui/src/main/java/forge/gui/home/PnlGroup.java -text
forge-gui/src/main/java/forge/gui/home/StartButton.java -text
forge-gui/src/main/java/forge/gui/home/VHomeUI.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletBuild.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletContests.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletLoad.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/ContestGauntletLister.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/QuickGauntletLister.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletBuild.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletContests.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletLoad.java -text
forge-gui/src/main/java/forge/gui/home/gauntlet/VSubmenuGauntletQuick.java -text
forge-gui/src/main/java/forge/gui/home/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java -text
forge-gui/src/main/java/forge/gui/home/quest/CSubmenuDuels.java -text
forge-gui/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java -text
forge-gui/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java -text
forge-gui/src/main/java/forge/gui/home/quest/CSubmenuQuestPrefs.java -text
forge-gui/src/main/java/forge/gui/home/quest/IVQuestStats.java -text
forge-gui/src/main/java/forge/gui/home/quest/PnlEvent.java -text
forge-gui/src/main/java/forge/gui/home/quest/QuestFileLister.java -text
forge-gui/src/main/java/forge/gui/home/quest/QuestPreferencesHandler.java -text
forge-gui/src/main/java/forge/gui/home/quest/SSubmenuQuestUtil.java -text
forge-gui/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java -text
forge-gui/src/main/java/forge/gui/home/quest/VSubmenuDuels.java -text
forge-gui/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java -text
forge-gui/src/main/java/forge/gui/home/quest/VSubmenuQuestDecks.java -text
forge-gui/src/main/java/forge/gui/home/quest/VSubmenuQuestPrefs.java -text
forge-gui/src/main/java/forge/gui/home/quest/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/home/sanctioned/AvatarSelector.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuDraft.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/ConstructedGameMenu.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuDraft.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuSealed.java -text
forge-gui/src/main/java/forge/gui/home/sanctioned/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/home/settings/CSubmenuAvatars.java -text
forge-gui/src/main/java/forge/gui/home/settings/CSubmenuDownloaders.java -text
forge-gui/src/main/java/forge/gui/home/settings/CSubmenuPreferences.java -text
forge-gui/src/main/java/forge/gui/home/settings/CSubmenuReleaseNotes.java -text
forge-gui/src/main/java/forge/gui/home/settings/GamePlayerUtil.java -text
forge-gui/src/main/java/forge/gui/home/settings/VSubmenuAvatars.java -text
forge-gui/src/main/java/forge/gui/home/settings/VSubmenuDownloaders.java -text
forge-gui/src/main/java/forge/gui/home/settings/VSubmenuPreferences.java -text
forge-gui/src/main/java/forge/gui/home/settings/VSubmenuReleaseNotes.java -text
forge-gui/src/main/java/forge/gui/home/settings/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/Input.java -text
forge-gui/src/main/java/forge/gui/input/InputAttack.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputBase.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputBlock.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputConfirm.java -text
forge-gui/src/main/java/forge/gui/input/InputConfirmMulligan.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputLockUI.java -text
forge-gui/src/main/java/forge/gui/input/InputPassPriority.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputPayMana.java -text
forge-gui/src/main/java/forge/gui/input/InputPayManaOfCostPayment.java -text
forge-gui/src/main/java/forge/gui/input/InputPayManaSimple.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/input/InputPayManaX.java -text
forge-gui/src/main/java/forge/gui/input/InputPlaybackControl.java -text
forge-gui/src/main/java/forge/gui/input/InputProliferate.java -text
forge-gui/src/main/java/forge/gui/input/InputSelectCardsForConvoke.java -text
forge-gui/src/main/java/forge/gui/input/InputSelectCardsFromList.java -text
forge-gui/src/main/java/forge/gui/input/InputSelectEntitiesFromList.java -text
forge-gui/src/main/java/forge/gui/input/InputSelectManyBase.java -text
forge-gui/src/main/java/forge/gui/input/InputSelectTargets.java -text
forge-gui/src/main/java/forge/gui/input/InputSynchronized.java -text
forge-gui/src/main/java/forge/gui/input/InputSyncronizedBase.java -text
forge-gui/src/main/java/forge/gui/input/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/match/CMatchUI.java -text
forge-gui/src/main/java/forge/gui/match/ControlWinLose.java -text
forge-gui/src/main/java/forge/gui/match/GameLogPanel.java -text
forge-gui/src/main/java/forge/gui/match/GauntletWinLose.java -text
forge-gui/src/main/java/forge/gui/match/LimitedWinLose.java -text
forge-gui/src/main/java/forge/gui/match/QuestWinLose.java -text
forge-gui/src/main/java/forge/gui/match/QuestWinLoseCardViewer.java -text
forge-gui/src/main/java/forge/gui/match/TargetingOverlay.java -text
forge-gui/src/main/java/forge/gui/match/VAssignDamage.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/match/VMatchUI.java -text
forge-gui/src/main/java/forge/gui/match/ViewWinLose.java -text
forge-gui/src/main/java/forge/gui/match/ZoneAction.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CAntes.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CCombat.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CCommand.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CDetail.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CDev.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CDock.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CField.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CHand.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CLog.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CPicture.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CPlayers.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CPrompt.java -text
forge-gui/src/main/java/forge/gui/match/controllers/CStack.java -text
forge-gui/src/main/java/forge/gui/match/controllers/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/match/menus/CMatchUIMenus.java -text
forge-gui/src/main/java/forge/gui/match/menus/CardOverlaysMenu.java -text
forge-gui/src/main/java/forge/gui/match/menus/DevModeMenu.java -text
forge-gui/src/main/java/forge/gui/match/menus/GameMenu.java -text
forge-gui/src/main/java/forge/gui/match/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/match/views/VAntes.java -text
forge-gui/src/main/java/forge/gui/match/views/VCombat.java -text
forge-gui/src/main/java/forge/gui/match/views/VCommand.java -text
forge-gui/src/main/java/forge/gui/match/views/VDetail.java -text
forge-gui/src/main/java/forge/gui/match/views/VDev.java -text
forge-gui/src/main/java/forge/gui/match/views/VDock.java -text
forge-gui/src/main/java/forge/gui/match/views/VField.java -text
forge-gui/src/main/java/forge/gui/match/views/VHand.java -text
forge-gui/src/main/java/forge/gui/match/views/VLog.java -text
forge-gui/src/main/java/forge/gui/match/views/VPicture.java -text
forge-gui/src/main/java/forge/gui/match/views/VPlayers.java -text
forge-gui/src/main/java/forge/gui/match/views/VPrompt.java -text
forge-gui/src/main/java/forge/gui/match/views/VStack.java -text
forge-gui/src/main/java/forge/gui/match/views/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/menus/ForgeMenu.java -text
forge-gui/src/main/java/forge/gui/menus/HelpMenu.java -text
forge-gui/src/main/java/forge/gui/menus/IMenuProvider.java -text
forge-gui/src/main/java/forge/gui/menus/LayoutMenu.java -text
forge-gui/src/main/java/forge/gui/menus/MenuUtil.java -text
forge-gui/src/main/java/forge/gui/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/player/HumanCostDecision.java -text
forge-gui/src/main/java/forge/gui/player/HumanPlay.java -text
forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java -text
forge-gui/src/main/java/forge/gui/player/LobbyPlayerHuman.java -text
forge-gui/src/main/java/forge/gui/player/PlayerControllerHuman.java -text
forge-gui/src/main/java/forge/gui/player/TargetSelection.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/player/package-info.java -text
forge-gui/src/main/java/forge/gui/toolbox/CardFaceSymbols.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/toolbox/ContextMenuBuilder.java -text
forge-gui/src/main/java/forge/gui/toolbox/FAbsolutePositioner.java -text
forge-gui/src/main/java/forge/gui/toolbox/FButton.java -text
forge-gui/src/main/java/forge/gui/toolbox/FCheckBox.java -text
forge-gui/src/main/java/forge/gui/toolbox/FComboBox.java -text
forge-gui/src/main/java/forge/gui/toolbox/FComboBoxPanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/FComboBoxWrapper.java -text
forge-gui/src/main/java/forge/gui/toolbox/FDigitalClock.java -text
forge-gui/src/main/java/forge/gui/toolbox/FHtmlViewer.java -text
forge-gui/src/main/java/forge/gui/toolbox/FLabel.java -text
forge-gui/src/main/java/forge/gui/toolbox/FList.java -text
forge-gui/src/main/java/forge/gui/toolbox/FMouseAdapter.java -text
forge-gui/src/main/java/forge/gui/toolbox/FOptionPane.java -text
forge-gui/src/main/java/forge/gui/toolbox/FOverlay.java -text
forge-gui/src/main/java/forge/gui/toolbox/FPanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/FProgressBar.java -text
forge-gui/src/main/java/forge/gui/toolbox/FRadioButton.java -text
forge-gui/src/main/java/forge/gui/toolbox/FScrollPane.java -text
forge-gui/src/main/java/forge/gui/toolbox/FScrollPanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/FSkin.java -text
forge-gui/src/main/java/forge/gui/toolbox/FTabbedPane.java -text
forge-gui/src/main/java/forge/gui/toolbox/FTextArea.java -text
forge-gui/src/main/java/forge/gui/toolbox/FTextEditor.java -text
forge-gui/src/main/java/forge/gui/toolbox/FTextField.java -text
forge-gui/src/main/java/forge/gui/toolbox/FUndoManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/IDisposable.java -text
forge-gui/src/main/java/forge/gui/toolbox/LayoutHelper.java -text
forge-gui/src/main/java/forge/gui/toolbox/SaveOpenDialog.java -text
forge-gui/src/main/java/forge/gui/toolbox/imaging/FImagePanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/imaging/FImageUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/imaging/ImageUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/CardManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerConfig.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SItemManagerUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SpellShopManager.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardCMCRangeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardColorFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardFormatFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardPowerFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardQuestWorldFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFolderFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/package-info.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ColorSetRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ColumnDef.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckStarRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/GroupDef.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ImageView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/IntegerRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumnConfig.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/toolbox/special/CardViewer.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/CardZoomer.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/PhaseIndicator.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/PhaseLabel.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/PlayerDetailsPanel.java -text
forge-gui/src/main/java/forge/gui/toolbox/special/package-info.java -text
forge-gui/src/main/java/forge/gui/workshop/CWorkshopUI.java -text
forge-gui/src/main/java/forge/gui/workshop/CardScriptInfo.java -text
forge-gui/src/main/java/forge/gui/workshop/VWorkshopUI.java -text
forge-gui/src/main/java/forge/gui/workshop/controllers/CCardDesigner.java -text
forge-gui/src/main/java/forge/gui/workshop/controllers/CCardScript.java -text
forge-gui/src/main/java/forge/gui/workshop/controllers/CWorkshopCatalog.java -text
forge-gui/src/main/java/forge/gui/workshop/menus/CWorkshopUIMenus.java -text
forge-gui/src/main/java/forge/gui/workshop/menus/WorkshopFileMenu.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VCardDesigner.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VCardScript.java -text
forge-gui/src/main/java/forge/gui/workshop/views/VWorkshopCatalog.java -text
forge-gui/src/main/java/forge/interfaces/IButton.java -text
forge-gui/src/main/java/forge/interfaces/IGuiBase.java -text
forge-gui/src/main/java/forge/interfaces/IProgressBar.java -text
forge-gui/src/main/java/forge/itemmanager/ColumnDef.java -text
forge-gui/src/main/java/forge/itemmanager/GroupDef.java -text
forge-gui/src/main/java/forge/itemmanager/IItemManager.java -text
forge-gui/src/main/java/forge/itemmanager/ItemColumn.java -text
forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java -text
forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java -text
forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java -text
forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java -text
forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java -text
forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java -text
forge-gui/src/main/java/forge/itemmanager/package-info.java -text
forge-gui/src/main/java/forge/limited/BoosterDeckBuilder.java -text
forge-gui/src/main/java/forge/limited/BoosterDraft.java svneol=native#text/plain
forge-gui/src/main/java/forge/limited/BoosterDraftAI.java svneol=native#text/plain
@@ -15908,6 +15999,32 @@ forge-gui/src/main/java/forge/limited/ReadDraftRankings.java -text
forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java svneol=native#text/plain
forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java svneol=native#text/plain
forge-gui/src/main/java/forge/limited/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/match/MatchConstants.java -text
forge-gui/src/main/java/forge/match/input/ButtonUtil.java -text
forge-gui/src/main/java/forge/match/input/Input.java -text
forge-gui/src/main/java/forge/match/input/InputAttack.java -text
forge-gui/src/main/java/forge/match/input/InputBase.java -text
forge-gui/src/main/java/forge/match/input/InputBlock.java -text
forge-gui/src/main/java/forge/match/input/InputConfirm.java -text
forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java -text
forge-gui/src/main/java/forge/match/input/InputLockUI.java -text
forge-gui/src/main/java/forge/match/input/InputPassPriority.java -text
forge-gui/src/main/java/forge/match/input/InputPayMana.java -text
forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java -text
forge-gui/src/main/java/forge/match/input/InputPayManaSimple.java -text
forge-gui/src/main/java/forge/match/input/InputPayManaX.java -text
forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java -text
forge-gui/src/main/java/forge/match/input/InputProliferate.java -text
forge-gui/src/main/java/forge/match/input/InputProxy.java -text
forge-gui/src/main/java/forge/match/input/InputQueue.java -text
forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvoke.java -text
forge-gui/src/main/java/forge/match/input/InputSelectCardsFromList.java -text
forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java -text
forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java -text
forge-gui/src/main/java/forge/match/input/InputSelectTargets.java -text
forge-gui/src/main/java/forge/match/input/InputSynchronized.java -text
forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java -text
forge-gui/src/main/java/forge/match/input/package-info.java -text
forge-gui/src/main/java/forge/model/CardBlock.java -text
forge-gui/src/main/java/forge/model/CardCollections.java -text
forge-gui/src/main/java/forge/model/FModel.java svneol=native#text/plain
@@ -15931,9 +16048,16 @@ forge-gui/src/main/java/forge/net/client/state/InLobbyClientState.java -text
forge-gui/src/main/java/forge/net/client/state/UnauthorizedClientState.java -text
forge-gui/src/main/java/forge/net/client/state/package-info.java -text
forge-gui/src/main/java/forge/net/package-info.java -text
forge-gui/src/main/java/forge/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/player/GamePlayerUtil.java -text
forge-gui/src/main/java/forge/player/HumanCostDecision.java -text
forge-gui/src/main/java/forge/player/HumanPlay.java -text
forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java -text
forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java -text
forge-gui/src/main/java/forge/player/PlayerControllerHuman.java -text
forge-gui/src/main/java/forge/player/TargetSelection.java -text
forge-gui/src/main/java/forge/player/package-info.java -text
forge-gui/src/main/java/forge/properties/ForgeConstants.java -text
forge-gui/src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain
forge-gui/src/main/java/forge/properties/NewConstants.java svneol=native#text/plain
forge-gui/src/main/java/forge/properties/Preferences.java svneol=native#text/plain
forge-gui/src/main/java/forge/properties/SavePreferencesListener.java svneol=native#text/plain
forge-gui/src/main/java/forge/properties/package-info.java svneol=native#text/plain
@@ -15978,9 +16102,6 @@ forge-gui/src/main/java/forge/quest/data/QuestData.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/data/QuestItemCondition.java -text
forge-gui/src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/data/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/gui/ViewItem.java -text
forge-gui/src/main/java/forge/quest/gui/ViewStall.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/gui/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/io/QuestChallengeReader.java -text
forge-gui/src/main/java/forge/quest/io/QuestDataIO.java svneol=native#text/plain
forge-gui/src/main/java/forge/quest/io/QuestDuelReader.java -text
@@ -15997,6 +16118,7 @@ forge-gui/src/main/java/forge/sound/SoundSystem.java -text
forge-gui/src/main/java/forge/util/AwtUtil.java -text
forge-gui/src/main/java/forge/util/Base64Coder.java svneol=native#text/plain
forge-gui/src/main/java/forge/util/Evaluator.java -text
forge-gui/src/main/java/forge/util/GuiDisplayUtil.java -text
forge-gui/src/main/java/forge/util/HttpUtil.java svneol=native#text/plain
forge-gui/src/main/java/forge/util/IgnoringXStream.java -text
forge-gui/src/main/java/forge/util/LineReader.java -text
@@ -16004,78 +16126,8 @@ forge-gui/src/main/java/forge/util/MultiplexOutputStream.java svneol=native#text
forge-gui/src/main/java/forge/util/OperatingSystem.java -text
forge-gui/src/main/java/forge/util/XmlUtil.java -text
forge-gui/src/main/java/forge/util/package-info.java -text
forge-gui/src/main/java/forge/view/ButtonUtil.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/CardReaderExperiments.java -text
forge-gui/src/main/java/forge/view/FDialog.java -text
forge-gui/src/main/java/forge/view/FFrame.java -text
forge-gui/src/main/java/forge/view/FNavigationBar.java -text
forge-gui/src/main/java/forge/view/FTitleBar.java -text
forge-gui/src/main/java/forge/view/FTitleBarBase.java -text
forge-gui/src/main/java/forge/view/FView.java -text
forge-gui/src/main/java/forge/view/ITitleBarOwner.java -text
forge-gui/src/main/java/forge/view/Main.java -text
forge-gui/src/main/java/forge/view/SplashFrame.java -text
forge-gui/src/main/java/forge/view/arcane/CardArea.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/CardPanel.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/CardPanelContainer.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/HandArea.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/PlayArea.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/ScaledImagePanel.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/ViewPanel.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/util/Animation.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/util/CardPanelMouseAdapter.java -text
forge-gui/src/main/java/forge/view/arcane/util/CardPanelMouseListener.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/util/OutlinedLabel.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/arcane/util/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/view/package-info.java svneol=native#text/plain
forge-gui/src/main/resources/proxy-template.ftl -text
forge-gui/src/site/apt/index.apt -text
forge-gui/src/test/java/forge/BoosterDraft1Test.java svneol=native#text/plain
forge-gui/src/test/java/forge/BoosterDraftTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/GuiDownloadPicturesLQTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/GuiDownloadSetPicturesLQTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/GuiProgressBarWindowTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/PanelTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/RunTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/TinyTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/gamesimulationtests/BaseGameSimulationTest.java -text
forge-gui/src/test/java/forge/gamesimulationtests/comprehensiverules/ComprehensiveRulesSection103.java -text
forge-gui/src/test/java/forge/gamesimulationtests/comprehensiverules/ComprehensiveRulesSection104.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/GameWrapper.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/IntegerConstraint.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/Specification.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/card/CardSpecification.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/card/CardSpecificationBuilder.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/card/CardSpecificationHandler.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecification.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecification.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecificationBuilder.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/player/PlayerSpecificationHandler.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/ActionPreCondition.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/ActivateAbilityAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/BasePlayerAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/CastSpellFromHandAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareBlockersAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/AssertAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/CardAssertAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/EndTestAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/PlayerAssertAction.java -text
forge-gui/src/test/java/forge/gamesimulationtests/util/playeractions/testactions/TestAction.java -text
forge-gui/src/test/java/forge/gui/ListChooserTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/gui/game/CardDetailPanelTest.java svneol=native#text/plain
forge-gui/src/test/java/forge/item/DeckHintsTest.java -text
forge-gui/src/test/java/forge/model/FModelTest.java -text
forge-gui/tools/PerSetTracking.py svneol=native#text/x-python
forge-gui/tools/assignSetInfo.py svneol=native#text/x-python
forge-gui/tools/cardTemplateScript.py svneol=native#text/x-python

View File

@@ -48,7 +48,6 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import java.awt.event.MouseEvent;
import java.security.InvalidParameterException;
import java.util.*;
@@ -72,7 +71,7 @@ public class PlayerControllerAi extends PlayerController {
}
public SpellAbility getAbilityToPlay(List<SpellAbility> abilities, MouseEvent triggerEvent) {
public SpellAbility getAbilityToPlay(List<SpellAbility> abilities, Object triggerEvent) {
if (abilities.size() == 0) {
return null;
}

View File

@@ -33,7 +33,6 @@ import forge.item.PaperCard;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@@ -108,12 +107,8 @@ public abstract class PlayerController {
public LobbyPlayer getLobbyPlayer() { return lobbyPlayer; }
public final SpellAbility getAbilityToPlay(List<SpellAbility> abilities) { return getAbilityToPlay(abilities, null); }
public abstract SpellAbility getAbilityToPlay(List<SpellAbility> abilities, MouseEvent triggerEvent);
public abstract SpellAbility getAbilityToPlay(List<SpellAbility> abilities, Object triggerEvent);
/**
* TODO: Write javadoc for this method.
* @param c
*/
//public abstract void playFromSuspend(Card c);
public abstract void playSpellAbilityForFree(SpellAbility copySA, boolean mayChoseNewTargets);
public abstract void playSpellAbilityNoStack(SpellAbility effectSA, boolean mayChoseNewTargets);

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>forge-gui-desktop</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=ISO-8859-1

View File

@@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7

View File

@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

515
forge-gui-desktop/pom.xml Normal file
View File

@@ -0,0 +1,515 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.5.16-SNAPSHOT</version>
</parent>
<artifactId>forge-gui-desktop</artifactId>
<packaging>jar</packaging>
<name>Forge</name>
<build>
<plugins>
<plugin>
<groupId>com.google.code.maven-svn-revision-number-plugin</groupId>
<artifactId>svn-revision-number-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<failOnError>false</failOnError>
<entries>
<entry>
<prefix>forge</prefix>
</entry>
</entries>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>build-version-string</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<exportAntProperties>true</exportAntProperties>
<target>
<condition property="fullversionstring" value="${project.version}-r${forge.revision}${forge.specialStatus}" else="${project.version}-r${forge.revision}${forge.specialStatus} (mixed revisions detected; please update from the root directory)">
<contains string="${forge.mixedRevisions}" substring="false" />
</condition>
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Implementation-Version>${fullversionstring}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<basedir>${basedir}/${configSourceDirectory}</basedir>
<filesToInclude>forge.sh, forge.command</filesToInclude>
<outputBasedir>${project.build.directory}</outputBasedir>
<outputDir>.</outputDir>
<regex>false</regex>
<replacements>
<replacement>
<token>$project.build.finalName$</token>
<value>${project.build.finalName}-jar-with-dependencies.jar</value>
</replacement>
</replacements>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<attach>false</attach>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>forge.view.Main</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Version>${fullversionstring}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- this is used for inheritance merges -->
<phase>package</phase>
<!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>released-version</id>
<phase>validate</phase>
<goals>
<goal>released-version</goal>
</goals>
</execution>
<execution>
<id>parse-version</id>
<goals>
<goal>parse-version</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>forge</groupId>
<artifactId>forge-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>forge</groupId>
<artifactId>forge-game</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>forge</groupId>
<artifactId>forge-ai</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>forge</groupId>
<artifactId>forge-net</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>forge</groupId>
<artifactId>forge-gui</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.miglayout</groupId>
<artifactId>miglayout</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.5</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.googlecode</groupId>
<artifactId>minlog</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>windows-linux</id>
<build>
<plugins>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.5.2</version>
<executions>
<execution>
<id>l4j-gui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<outfile>${project.build.directory}/forge.exe</outfile>
<jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
<dontWrapJar>true</dontWrapJar>
<errTitle>forge</errTitle>
<icon>src/main/config/forge.ico</icon>
<classPath>
<mainClass>forge.view.Main</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<minVersion>1.7.0</minVersion>
<maxHeapSize>1024</maxHeapSize>
</jre>
<versionInfo>
<fileVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0</fileVersion>
<txtFileVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0</txtFileVersion>
<fileDescription>Forge</fileDescription>
<copyright>Forge</copyright>
<productVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0</productVersion>
<txtProductVersion>${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0</txtProductVersion>
<productName>Forge</productName>
<internalName>forge</internalName>
<originalFilename>forge.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>win-linux-app-bundle</id>
<phase>pre-integration-test</phase>
<configuration>
<target>
<!-- Windows/Linux archive -->
<mkdir dir="${project.build.directory}/${project.build.finalName}" />
<copy todir="${project.build.directory}/${project.build.finalName}">
<fileset dir="${project.build.directory}" includes="forge.sh" />
<fileset dir="${project.build.directory}" includes="forge.command" />
<fileset dir="${basedir}" includes="forge.profile.properties.example" />
<fileset dir="${basedir}" includes="LICENSE.txt" />
<fileset dir="${basedir}" includes="README.txt" />
<fileset dir="${basedir}" includes="CHANGES.txt" />
<fileset dir="${basedir}">
<include name="res/**" />
<exclude name="res/cardsfolder/**" />
</fileset>
<fileset dir="${project.build.directory}" includes="forge.exe" />
<fileset dir="${project.build.directory}" includes="${project.build.finalName}-jar-with-dependencies.jar" />
</copy>
<mkdir dir="${project.build.directory}/${project.build.finalName}/res/cardsfolder" />
<zip destfile="${project.build.directory}/${project.build.finalName}/res/cardsfolder/cardsfolder.zip" basedir="${basedir}/res/cardsfolder" level="1" />
<chmod file="${project.build.directory}/${project.build.finalName}/forge.sh" perm="a+rx" />
<chmod file="${project.build.directory}/${project.build.finalName}/forge.command" perm="a+rx" />
<chmod file="${project.build.directory}/${project.build.finalName}/forge.exe" perm="a+rx" />
<tar destfile="${project.build.directory}/${project.build.finalName}.tar.bz2" compression="bzip2">
<tarfileset filemode="755" dir="${project.build.directory}/${project.build.finalName}">
<include name="forge.sh" />
<include name="forge.command" />
<include name="forge.exe" />
</tarfileset>
<tarfileset dir="${project.build.directory}/${project.build.finalName}">
<include name="**" />
<exclude name="forge.sh" />
<exclude name="forge.command" />
<exclude name="forge.exe" />
</tarfileset>
</tar>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>released-version</id>
<phase>validate</phase>
<goals>
<goal>released-version</goal>
</goals>
</execution>
<execution>
<id>parse-version</id>
<goals>
<goal>parse-version</goal>
</goals>
</execution>
<execution>
<id>attach-distribution</id>
<phase>post-integration-test</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/${project.build.finalName}.tar.bz2</file>
<type>tar.bz2</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<properties>
<license.file.name>"LICENSE.txt"</license.file.name>
<changes.file.name>"CHANGES.txt"</changes.file.name>
<readme.file.name>"README.txt"</readme.file.name>
<forge.file.name>"Forge"</forge.file.name>
<applications.file.name>"Applications"</applications.file.name>
</properties>
<id>osx</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>osx-appbundle</id>
<phase>pre-integration-test</phase>
<configuration>
<target>
<mkdir dir="${project.build.directory}/${project.build.finalName}-osx" />
<copy todir="${project.build.directory}/${project.build.finalName}-osx">
<fileset dir="${basedir}" includes="LICENSE.txt" />
<fileset dir="${basedir}" includes="README.txt" />
<fileset dir="${basedir}" includes="CHANGES.txt" />
</copy>
<taskdef name="bundleapp" classpath="${basedir}/${configSourceDirectory}/appbundler-1.0-custom.jar" classname="com.oracle.appbundler.AppBundlerTask" />
<bundleapp outputdirectory="${project.build.directory}/${project.build.finalName}-osx" name="${project.name}" displayname="${project.name}" shortversion="${project.version}" identifier="forge.view.Main" icon="${basedir}/${configSourceDirectory}/Forge.icns" applicationCategory="public.app-category.games" mainclassname="forge.view.Main">
<classpath file="${project.build.directory}/${project.build.finalName}-jar-with-dependencies.jar" />
<classpath file="${basedir}/forge.profile.properties.example" />
<option value="-Dapple.laf.useScreenMenuBar=true" />
<option value="-Dcom.apple.macos.use-file-dialog-packages=true" />
<option value="-Dcom.apple.macos.useScreenMenuBar=true" />
<option value="-Dcom.apple.mrj.application.apple.menu.about.name=Forge" />
<option value="-Dcom.apple.smallTabs=true" />
<option value="-Xmx1024M" />
<option value="-Dapp.dir=$APP_ROOT/Contents/Resources/" />
</bundleapp>
<copy todir="${project.build.directory}/${project.build.finalName}-osx/Forge.app/Contents/Resources/res">
<fileset dir="${basedir}/res" excludes="**/cardsfolder/**" />
</copy>
<mkdir dir="${project.build.directory}/${project.build.finalName}-osx/Forge.app/Contents/Resources/res/cardsfolder" />
<zip destfile="${project.build.directory}/${project.build.finalName}-osx/Forge.app/Contents/Resources/res/cardsfolder/cardsfolder.zip" basedir="${basedir}/res/cardsfolder" level="1" />
<symlink link="${project.build.directory}/${project.build.finalName}-osx/Applications" resource="/Applications" />
<exec executable="${basedir}/${configSourceDirectory}/create-dmg" failonerror="false">
<arg line="--volname ${project.name}-${project.version} --background ${basedir}/${configSourceDirectory}/backgroundImage.jpg --window-size 700 419 --icon-size 64 --icon ${forge.file.name} 141 283 --icon ${applications.file.name} 452 283 --icon ${changes.file.name} 645 80 --icon ${license.file.name} 645 200 --icon ${readme.file.name} 645 320 ${project.build.directory}/${project.build.finalName}.dmg ${project.build.directory}/${project.build.finalName}-osx" />
</exec>
<tar basedir="${project.build.directory}" includes="${project.build.finalName}.dmg" destfile="${project.build.directory}/${project.build.finalName}-osx.tar.bz2" compression="bzip2" />
<!--<symlink link="${project.build.directory}/${project.build.finalName}-osx/Applications" action="delete" /> -->
<exec executable="rm" failonerror="false">
<arg line="-f ${project.build.directory}/${project.build.finalName}-osx/Applications" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>released-version</id>
<phase>validate</phase>
<goals>
<goal>released-version</goal>
</goals>
</execution>
<execution>
<id>parse-version</id>
<goals>
<goal>parse-version</goal>
</goals>
</execution>
<execution>
<id>attach-distribution-osx</id>
<phase>post-integration-test</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/${project.build.finalName}-osx.tar.bz2
</file>
<type>tar.bz2</type>
<classifier>osx</classifier>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>test-deploy</id>
<distributionManagement>
<repository>
<id>cardforge-repo-local</id>
<url>ftp://localhost/Users/dhudson/releases</url>
</repository>
<snapshotRepository>
<id>cardforge-snapshot-repo-local</id>
<url>ftp://localhost/Users/dhudson/snapshots</url>
</snapshotRepository>
</distributionManagement>
</profile>
</profiles>
</project>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

View File

@@ -0,0 +1,26 @@
SET app_name create-dmg
VERSION create-dmg.cur create-dmg heads/master
NEWDIR build.dir temp %-build -
NEWFILE create-dmg.zip featured %.zip %
COPYTO [build.dir]
INTO create-dmg [create-dmg.cur]/create-dmg
INTO sample [create-dmg.cur]/sample
INTO support [create-dmg.cur]/support
SUBSTVARS [build.dir<alter>]/create-dmg [[]]
ZIP [create-dmg.zip]
INTO [build-files-prefix] [build.dir]
PUT megabox-builds create-dmg.zip
PUT megabox-builds build.log
PUT s3-builds create-dmg.zip
PUT s3-builds build.log

View File

@@ -0,0 +1,210 @@
#! /bin/bash
# Create a read-only disk image of the contents of a folder
set -e;
function pure_version() {
echo '1.0.0.2'
}
function version() {
echo "create-dmg $(pure_version)"
}
function usage() {
version
echo "Creates a fancy DMG file."
echo "Usage: $(basename $0) options... image.dmg source_folder"
echo "All contents of source_folder will be copied into the disk image."
echo "Options:"
echo " --volname name"
echo " set volume name (displayed in the Finder sidebar and window title)"
echo " --volicon icon.icns"
echo " set volume icon"
echo " --background pic.png"
echo " set folder background image (provide png, gif, jpg)"
echo " --window-pos x y"
echo " set position the folder window"
echo " --window-size width height"
echo " set size of the folder window"
echo " --icon-size icon_size"
echo " set window icons size (up to 128)"
echo " --icon file_name x y"
echo " set position of the file's icon"
echo " --hide-extension file_name"
echo " hide the extension of file"
echo " --custom-icon file_name custom_icon_or_sample_file x y"
echo " set position and custom icon"
echo " --app-drop-link x y"
echo " make a drop link to Applications, at location x,y"
echo " --eula eula_file"
echo " attach a license file to the dmg"
echo " --version show tool version number"
echo " -h, --help display this help"
exit 0
}
WINX=10
WINY=60
WINW=500
WINH=350
ICON_SIZE=128
while test "${1:0:1}" = "-"; do
case $1 in
--volname)
VOLUME_NAME="$2"
shift; shift;;
--volicon)
VOLUME_ICON_FILE="$2"
shift; shift;;
--background)
BACKGROUND_FILE="$2"
BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)"
BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\""
shift; shift;;
--icon-size)
ICON_SIZE="$2"
shift; shift;;
--window-pos)
WINX=$2; WINY=$3
shift; shift; shift;;
--window-size)
WINW=$2; WINH=$3
shift; shift; shift;;
--icon)
POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4}
"
shift; shift; shift; shift;;
--hide-extension)
HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true"
shift; shift;;
--custom-icon)
shift; shift; shift; shift; shift;;
-h | --help)
usage;;
--version)
version; exit 0;;
--pure-version)
pure_version; exit 0;;
--app-drop-link)
APPLICATION_LINK=$2
APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3}
"
shift; shift; shift;;
--eula)
EULA_RSRC=$2
shift; shift;;
-*)
echo "Unknown option $1. Run with --help for help."
exit 1;;
esac
done
test -z "$2" && {
echo "Not enough arguments. Invoke with --help for help."
exit 1
}
DMG_PATH="$1"
DMG_DIRNAME="$(dirname "$DMG_PATH")"
DMG_DIR="$(cd $DMG_DIRNAME > /dev/null; pwd)"
DMG_NAME="$(basename "$DMG_PATH")"
DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}"
SRC_FOLDER="$(cd "$2" > /dev/null; pwd)"
test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)"
AUX_PATH="$(dirname $0)/support"
test -d "$AUX_PATH" || {
echo "Cannot find support directory: $AUX_PATH"
exit 1
}
if [ -f "$SRC_FOLDER/.DS_Store" ]; then
echo "Deleting any .DS_Store in source folder"
rm "$SRC_FOLDER/.DS_Store"
fi
# Create the image
echo "Creating disk image..."
test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}"
ACTUAL_SIZE=`du -sm "$SRC_FOLDER" | sed -e 's/ .*//g'`
DISK_IMAGE_SIZE=$(expr $ACTUAL_SIZE + 20)
hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}"
# mount it
echo "Mounting disk image..."
MOUNT_DIR="/Volumes/${VOLUME_NAME}"
# try unmount dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it)
echo "Unmounting disk image..."
DEV_NAME=$(hdiutil info | egrep '^/dev/' | sed 1q | awk '{print $1}')
test -d "${MOUNT_DIR}" && hdiutil detach "${DEV_NAME}"
echo "Mount directory: $MOUNT_DIR"
DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}')
echo "Device name: $DEV_NAME"
if ! test -z "$BACKGROUND_FILE"; then
echo "Copying background file..."
test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background"
cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME"
fi
if ! test -z "$APPLICATION_LINK"; then
echo "making link to Applications dir"
echo $MOUNT_DIR
ln -s /Applications "$MOUNT_DIR/Applications"
fi
if ! test -z "$VOLUME_ICON_FILE"; then
echo "Copying volume icon file '$VOLUME_ICON_FILE'..."
cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns"
SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns"
fi
# run applescript
APPLESCRIPT=$(mktemp -t createdmg)
cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" >"$APPLESCRIPT"
echo "Running Applescript: /usr/bin/osascript \"${APPLESCRIPT}\" \"${VOLUME_NAME}\""
"/usr/bin/osascript" "${APPLESCRIPT}" "${VOLUME_NAME}" || true
echo "Done running the applescript..."
sleep 4
rm "$APPLESCRIPT"
# make sure it's not world writeable
echo "Fixing permissions..."
chmod -Rf go-w "${MOUNT_DIR}" &> /dev/null || true
echo "Done fixing permissions."
# make the top window open itself on mount:
echo "Blessing started"
bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}"
echo "Blessing finished"
if ! test -z "$VOLUME_ICON_FILE"; then
# tell the volume that it has a special file attribute
SetFile -a C "$MOUNT_DIR"
fi
# unmount
echo "Unmounting disk image..."
hdiutil detach "${DEV_NAME}"
# compress image
echo "Compressing disk image..."
hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}"
rm -f "${DMG_TEMP_NAME}"
# adding EULA resources
if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then
echo "adding EULA resources"
"${AUX_PATH}/dmg-license.py" "${DMG_DIR}/${DMG_NAME}" "${EULA_RSRC}"
fi
echo "Disk image done"
exit 0

View File

@@ -0,0 +1,3 @@
#!/bin/sh
cd "`dirname \"$0\"`"
java -Xmx1024m -jar $project.build.finalName$

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

@@ -0,0 +1,3 @@
#!/bin/sh
cd "`dirname \"$0\"`"
java -Xmx1024m -jar $project.build.finalName$

View File

@@ -0,0 +1,215 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
http://java.sun.com/docs/books/jls/second_edition/html/index.html
- the Sun Code Conventions at http://java.sun.com/docs/codeconv/
- the Javadoc guidelines at
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
- the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.sf.net (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
Finally, it is worth reading the documentation.
-->
<module name="Checker">
<!--
If you set the basedir property below, then all reported file
names will be relative to the specified directory. See
http://checkstyle.sourceforge.net/5.x/config.html#Checker
<property name="basedir" value="${basedir}"/>
-->
<!-- Checks that a package-info.java file exists for each package. -->
<!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocPackage -->
<!-- <module name="JavadocPackage"/> -->
<!-- Checks whether files end with a new line. -->
<!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
<module name="NewlineAtEndOfFile"><property name="lineSeparator" value="lf"/></module>
<!-- Checks that property files contain the same keys. -->
<!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
<module name="Translation"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<!-- <module name="FileLength"/> -->
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter"/>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<module name="RegexpSingleline">
<property name="format" value="(^|[^\*])\s+$"/>
<property name="minimum" value="0"/>
<property name="maximum" value="0"/>
<property name="message" value="Line has trailing spaces."/>
</module>
<module name="TreeWalker">
<property name="cacheFile" value="${cacheFile}"/>
<!-- Checks for Javadoc comments. -->
<!-- See http://checkstyle.sf.net/config_javadoc.html -->
<module name="JavadocMethod">
<property name="scope" value="package"/>
</module>
<module name="JavadocType">
<property name="scope" value="package"/>
</module>
<module name="JavadocVariable">
<property name="scope" value="package"/>
</module>
<module name="JavadocStyle"/>
<!-- Checks for Naming Conventions. -->
<!-- See http://checkstyle.sf.net/config_naming.html -->
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<!-- Allow test_ methods to have underscores in them. -->
<module name="MethodName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$|^test_[_a-zA-Z0-9]*$"/>
</module>
<module name="PackageName"/>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName"/>
<!-- Checks for Headers -->
<!-- See http://checkstyle.sf.net/config_header.html -->
<!-- <module name="Header"> -->
<!-- The follow property value demonstrates the ability -->
<!-- to have access to ANT properties. In this case it uses -->
<!-- the ${basedir} property to allow Checkstyle to be run -->
<!-- from any directory within a project. See property -->
<!-- expansion, -->
<!-- http://checkstyle.sf.net/config.html#properties -->
<!-- <property -->
<!-- name="headerFile" -->
<!-- value="${basedir}/java.header"/> -->
<!-- </module> -->
<!-- Following interprets the header file as regular expressions. -->
<!-- <module name="RegexpHeader"/> -->
<!-- Checks for imports -->
<!-- See http://checkstyle.sf.net/config_import.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/>
<!-- defaults to sun.* packages -->
<module name="RedundantImport"/>
<module name="UnusedImports"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<!-- <module name="LineLength">
<property name="max" value="180"/>
</module>
<module name="MethodLength"/>
<module name="ParameterNumber"/> -->
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter">
<property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/>
</module>
<module name="NoWhitespaceBefore"/>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<!-- Modifier Checks -->
<!-- See http://checkstyle.sf.net/config_modifiers.html -->
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<!-- Checks for blocks. You know, those {}'s -->
<!-- See http://checkstyle.sf.net/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<!-- Allow empty blocks. <module name="EmptyBlock"/> -->
<module name="LeftCurly">
<!-- Place left curly at EOL for one-line clauses,
and on next line for multi-line clauses.
-->
<!-- <property name="option" value="nlow" /> -->
</module>
<module name="NeedBraces"/>
<!-- Allow for right curly to appear on same or next line. <module name="RightCurly"/> -->
<!-- Checks for common coding problems -->
<!-- See http://checkstyle.sf.net/config_coding.html -->
<!-- <module name="AvoidInlineConditionals"/> -->
<module name="DoubleCheckedLocking"/>
<!-- MY FAVOURITE -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<!-- <module name="HiddenField"/> -->
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<!-- <module name="MagicNumber"/> -->
<module name="MissingSwitchDefault"/>
<module name="RedundantThrows"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<!-- Checks for class design -->
<!-- See http://checkstyle.sf.net/config_design.html -->
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/>
<!-- <module name="HideUtilityClassConstructor"/> -->
<module name="InterfaceIsType"/>
<module name="VisibilityModifier"/>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<module name="ArrayTypeStyle"/>
<!-- <module name="FinalParameters"/> -->
<!-- <module name="TodoComment"/> -->
<module name="UpperEll"/>
</module>
</module>

View File

@@ -0,0 +1,141 @@
#! /usr/bin/env python
"""
This script adds a license file to a DMG. Requires Xcode and a plain ascii text
license file.
Obviously only runs on a Mac.
Copyright (C) 2011 Jared Hobbs
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
"""
import os
import sys
import tempfile
import optparse
class Path(str):
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
os.unlink(self)
def mktemp(dir=None, suffix=''):
(fd, filename) = tempfile.mkstemp(dir=dir, suffix=suffix)
os.close(fd)
return Path(filename)
def main(options, args):
dmgFile, license = args
with mktemp('.') as tmpFile:
with open(tmpFile, 'w') as f:
f.write("""data 'LPic' (5000) {
$"0002 0011 0003 0001 0000 0000 0002 0000"
$"0000 000E 0006 0001 0005 0007 0000 0007"
$"0008 0000 0047 0009 0000 0034 000A 0001"
$"0035 000B 0001 0020 000C 0000 0011 000D"
$"0000 005B 0004 0000 0033 000F 0001 000C"
$"0010 0000 000B 000E 0000"
};\n\n""")
with open(license, 'r') as l:
f.write('data \'TEXT\' (5002, "English") {\n')
for line in l:
if len(line) < 1000:
f.write(' "' + line.strip().replace('"', '\\"') +
'\\n"\n')
else:
for liner in line.split('.'):
f.write(' "' +
liner.strip().replace('"', '\\"') +
'. \\n"\n')
f.write('};\n\n')
f.write("""resource 'STR#' (5002, "English") {
{
"English",
"Agree",
"Disagree",
"Print",
"Save...",
"IMPORTANT - By clicking on the \\"Agree\\" button, you agree "
"to be bound by the terms of the License Agreement.",
"Software License Agreement",
"This text cannot be saved. This disk may be full or locked, or the "
"file may be locked.",
"Unable to print. Make sure you have selected a printer."
}
};""")
os.system('/usr/bin/hdiutil unflatten -quiet "%s"' % dmgFile)
os.system('%s "%s/"*.r %s -a -o "%s"' %
(options.rez, options.flat_carbon, tmpFile, dmgFile))
os.system('/usr/bin/hdiutil flatten -quiet "%s"' % dmgFile)
if options.compression is not None:
os.system('cp %s %s.temp.dmg' % (dmgFile, dmgFile))
os.remove(dmgFile)
if options.compression == "bz2":
os.system('hdiutil convert %s.temp.dmg -format UDBZ -o %s' %
(dmgFile, dmgFile))
elif options.compression == "gz":
os.system('hdiutil convert %s.temp.dmg -format ' % dmgFile +
'UDZO -imagekey zlib-devel=9 -o %s' % dmgFile)
os.remove('%s.temp.dmg' % dmgFile)
print "Successfully added license to '%s'" % dmgFile
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.set_usage("""%prog <dmgFile> <licenseFile> [OPTIONS]
This program adds a software license agreement to a DMG file.
It requires Xcode and a plain ascii text <licenseFile>.
See --help for more details.""")
parser.add_option(
'--rez',
'-r',
action='store',
default='/Applications/Xcode.app/Contents/Developer/Tools/Rez',
help='The path to the Rez tool. Defaults to %default'
)
parser.add_option(
'--flat-carbon',
'-f',
action='store',
default='/Applications/Xcode.app/Contents/Developer/Platforms'
'/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk'
'/Developer/Headers/FlatCarbon',
help='The path to the FlatCarbon headers. Defaults to %default'
)
parser.add_option(
'--compression',
'-c',
action='store',
choices=['bz2', 'gz'],
default=None,
help='Optionally compress dmg using specified compression type. '
'Choices are bz2 and gz.'
)
options, args = parser.parse_args()
cond = len(args) != 2 or not os.path.exists(options.rez) \
or not os.path.exists(options.flat_carbon)
if cond:
parser.print_usage()
sys.exit(1)
main(options, args)

View File

@@ -0,0 +1,77 @@
on run (volumeName)
tell application "Finder"
tell disk (volumeName as string)
open
set theXOrigin to WINX
set theYOrigin to WINY
set theWidth to WINW
set theHeight to WINH
set theBottomRightX to (theXOrigin + theWidth)
set theBottomRightY to (theYOrigin + theHeight)
set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\""
tell container window
set current view to icon view
set toolbar visible to false
set statusbar visible to false
set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY}
set statusbar visible to false
end tell
set opts to the icon view options of container window
tell opts
set icon size to ICON_SIZE
set arrangement to not arranged
end tell
BACKGROUND_CLAUSE
-- Positioning
POSITION_CLAUSE
-- Hiding
HIDING_CLAUSE
-- Application Link Clause
APPLICATION_CLAUSE
close
open
update without registering applications
-- Force saving of the size
delay 1
tell container window
set statusbar visible to false
set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10}
end tell
update without registering applications
end tell
delay 1
tell disk (volumeName as string)
tell container window
set statusbar visible to false
set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY}
end tell
update without registering applications
end tell
--give the finder some time to write the .DS_Store file
delay 3
set waitTime to 0
set ejectMe to false
repeat while ejectMe is false
delay 1
set waitTime to waitTime + 1
if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true
end repeat
log "waited " & waitTime & " seconds for .DS_STORE to be created."
end tell
end run

View File

@@ -0,0 +1,100 @@
<html>
<head>
<title>Tail-based by Web Sockets</title>
<link href="css/core.css" media="all" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="js/observable.js"></script>
<script type="text/javascript" src="js/socket.js"></script>
<script type='text/javascript' src="js/main.js"></script>
</head>
<body>
<div class="wrap">
<div class="title">
<span>Your server: <b>ws://</b></span>
<input id="ws_uri" type="text" value="localhost:81/" name="uri"/>
<button id="connect" name="connect" class="cn">Connect</button>
<button id="disconn" name="disconn" class="dc" disabled="disabled">Disconnect</button>
</div>
<ul class="messages" id='messages'></ul>
<div class="packets" id='input'>
<span>Raw text to send:</span>
<input type="text" name="packet" value="" />
<button id="send" class="send">Send</button>
</div>
</div>
<script type="text/javascript">
if (!window.WebSocket)
alert("WebSocket not supported by this browser");
var server = Socket();
var listener = {
onOpen : function() {
$('#input').slideDown();
},
onMessage : function(m) {
if (m.data) {
addLi("incoming", m.data);
}
},
onClose : function(m) {
addLi("error", "Connection was closed (" + m.code + "): " + m.reason);
onDisconnectClicked();
$('#input').fadeOut();
}
};
server.addObserver(listener);
function addLi(className, text) {
var spanText = document.createElement('li');
spanText.className = className;
spanText.innerHTML = text;
var messageBox = $('#messages')[0];
messageBox.appendChild(spanText);
messageBox.scrollTop = messageBox.scrollHeight - messageBox.clientHeight;
}
function onConnectClicked() {
var uri = $("#ws_uri").val()
addLi("connecting", "Connecting to ws://" + uri + " ..." )
server.connect(uri);
$('#connect').attr("disabled", "disabled")
$('#disconn').removeAttr("disabled")
}
function onDisconnectClicked() {
server.close();
$('#disconn').attr("disabled", "disabled")
$('#connect').removeAttr("disabled")
}
function onSendClicked() {
var toSend = $("#input input").val();
$("#input input").val("");
addLi("outcoming", toSend);
server.send(toSend)
}
function onInputKey(event) {
if( event.keyCode == 13 )
onSendClicked();
}
function onReady() {
$('#connect').on("click", onConnectClicked);
$('#disconn').on("click", onDisconnectClicked);
$('#send').on("click", onSendClicked);
$("#input input").on("keypress", onInputKey);
}
$(onReady)
</script>
</body>
</html>

View File

@@ -0,0 +1,23 @@
ul, ol { margin: 0; }
div { border: 0px solid black; }
div.wrap { width: 640px; margin: 100px auto;}
.title { height: 24px; background-color: #ddd; padding: 4px; border: 1px solid black; border-bottom: 0px }
.title input {width: 300px; }
.title span { display: inline-block; width: 120px; text-align: right; }
.messages { height: 30ex; overflow: auto; background-color: #fff; padding: 4px; border: 1px solid black; list-style: none; }
.messages .incoming { color: #006; }
.messages .incoming:before { content: "<< "}
.messages .outcoming { color: #060; }
.messages .outcoming:before { content: ">> "}
.messages .error { color: #600; }
.messages li:nth-child(2n) { background-color: #f7f7f7; }
.packets { padding: 4px; background-color: #ddd; border: 1px solid black; border-top: 0px; display: none; }
.packets span { display: inline-block; width: 120px; text-align: right; }
.packets input {width: 400px; }
.packets button { width: 100px; }
span.alert { font-style: italic; }

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
var Observable = function(eventNames) {
var _t = {};
var observers = {};
_t.addObserver = function(obj) {
for(var i = 0; i < eventNames.length; i++) {
var evName = eventNames[i]
var method = obj["on" + evName];
if( typeof(method) === 'function') {
var handlers = observers[evName]
if( 'undefined' === typeof(handler))
handlers = observers[evName] = [];
handlers.push(obj);
}
}
}
_t.fireEvent = function() { // usually invoked as .apply(EventName, args)
var q = observers[this]
if ( q ) for( var i = 0; i < q.length; i++ ) q[i]['on'+ this].apply(q[i], arguments);
}
return _t;
}

View File

@@ -0,0 +1,27 @@
// There should be some kind of fallback to Flash-powered sockets (IE 9-, Opera with sockets switched off)
var Socket = function() {
var _t = Observable(["Open", "Message", "Close", "Error"]);
function onOpen() { _t.fireEvent.apply("Open", arguments); }
function onClose() { _t.fireEvent.apply("Close", arguments); }
function onError() { _t.fireEvent.apply("Error", arguments); }
function onMessage() { _t.fireEvent.apply("Message", arguments); }
var ws;
_t.connect = function(location) {
ws = new WebSocket("ws://" + location);
ws.onopen = onOpen;
ws.onmessage = onMessage;
ws.onclose = onClose;
ws.onerror = onError;
}
// _t.getWs = function() { return ws; }
_t.isOpen = function() { return ws && ws.readyState == ws.OPEN; }
_t.close = function() { ws && ws.close(); }
_t.send = function(text) { text != null && text.length > 0 && ws && ws.send(text); };
return _t;
};

View File

@@ -0,0 +1,369 @@
package forge;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function;
import forge.assets.FSkinProp;
import forge.assets.ISkinImage;
import forge.control.FControl;
import forge.error.BugReporter;
import forge.events.UiEvent;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameType;
import forge.game.card.Card;
import forge.game.combat.Combat;
import forge.game.event.GameEventTurnBegan;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.gui.CardListViewer;
import forge.gui.FNetOverlay;
import forge.gui.GuiChoose;
import forge.gui.GuiUtils;
import forge.gui.SOverlayUtils;
import forge.gui.framework.SDisplayUtil;
import forge.gui.framework.SLayoutIO;
import forge.interfaces.IButton;
import forge.interfaces.IGuiBase;
import forge.item.PaperCard;
import forge.match.input.InputQueue;
import forge.net.FServer;
import forge.screens.match.CMatchUI;
import forge.screens.match.VMatchUI;
import forge.screens.match.ViewWinLose;
import forge.screens.match.controllers.CPrompt;
import forge.screens.match.controllers.CStack;
import forge.screens.match.views.VField;
import forge.screens.match.views.VHand;
import forge.screens.match.views.VPrompt;
import forge.toolbox.FButton;
import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinImage;
import forge.toolbox.special.PhaseLabel;
import forge.util.BuildInfo;
public class GuiDesktop implements IGuiBase {
public void invokeInEdtLater(Runnable runnable) {
SwingUtilities.invokeLater(runnable);
}
public void invokeInEdtAndWait(final Runnable proc) {
if (SwingUtilities.isEventDispatchThread()) {
// Just run in the current thread.
proc.run();
}
else {
try {
SwingUtilities.invokeAndWait(proc);
}
catch (final InterruptedException exn) {
throw new RuntimeException(exn);
}
catch (final InvocationTargetException exn) {
throw new RuntimeException(exn);
}
}
}
public boolean isGuiThread() {
return SwingUtilities.isEventDispatchThread();
}
public String getAssetsRoot() {
return StringUtils.containsIgnoreCase(BuildInfo.getVersionString(), "svn") ?
"../forge-gui/res/" : "res/";
}
public boolean mayShowCard(Card card) {
return Singletons.getControl().mayShowCard(card);
}
public void reportBug(String details) {
BugReporter.reportBug(details);
}
public void reportException(Throwable ex) {
BugReporter.reportException(ex);
}
public void reportException(Throwable ex, String message) {
BugReporter.reportException(ex, message);
}
public boolean showConfirmDialog(String message) {
return FOptionPane.showConfirmDialog(message);
}
public ISkinImage getUnskinnedIcon(String path) {
return new FSkin.UnskinnedIcon(path);
}
public int showOptionDialog(String message, String title, ISkinImage icon, String[] options, int defaultOption) {
return FOptionPane.showOptionDialog(message, title, (SkinImage)icon, options, defaultOption);
}
public <T> T showInputDialog(String message, String title, ISkinImage icon, T initialInput, T[] inputOptions) {
return FOptionPane.showInputDialog(message, title, (SkinImage)icon, initialInput, inputOptions);
}
public <T> List<T> getChoices(final String message, final int min, final int max, final Collection<T> choices, final T selected, final Function<T, String> display) {
return GuiChoose.getChoices(message, min, max, choices, selected, display);
}
public <T> List<T> order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax,
final List<T> sourceChoices, final List<T> destChoices, final Card referenceCard, final boolean sideboardingMode) {
return GuiChoose.order(title, top, sourceChoices, referenceCard);
}
public void showCardList(final String title, final String message, final List<PaperCard> list) {
final CardListViewer cardView = new CardListViewer(title, message, list);
cardView.setVisible(true);
cardView.dispose();
}
public IButton getBtnOK() {
return VMatchUI.SINGLETON_INSTANCE.getBtnOK();
}
public IButton getBtnCancel() {
return VMatchUI.SINGLETON_INSTANCE.getBtnCancel();
}
public void focusButton(final IButton button) {
// ensure we don't steal focus from an overlay
if (!SOverlayUtils.overlayHasFocus()) {
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
((FButton)button).requestFocusInWindow();
}
});
}
}
public void flashIncorrectAction() {
SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE);
}
public void updatePhase() {
PhaseHandler pH = Singletons.getControl().getObservedGame().getPhaseHandler();
Player p = pH.getPlayerTurn();
PhaseType ph = pH.getPhase();
final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE;
PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph);
matchUi.resetAllPhaseButtons();
if (lbl != null) lbl.setActive(true);
}
public void updateTurn(final GameEventTurnBegan event, final Game game) {
VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(event.turnOwner);
SDisplayUtil.showTab(nextField);
CPrompt.SINGLETON_INSTANCE.updateText(game);
}
public void updatePlayerControl() {
CMatchUI.SINGLETON_INSTANCE.initHandViews(FServer.getLobby().getGuiPlayer());
SLayoutIO.loadLayout(null);
VMatchUI.SINGLETON_INSTANCE.populate();
for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) {
h.getLayoutControl().updateHand();
}
}
public void finishGame() {
new ViewWinLose(Singletons.getControl().getObservedGame());
SOverlayUtils.showOverlay();
}
public void updateStack() {
CStack.SINGLETON_INSTANCE.update();
}
public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
FControl.instance.startMatch(gameType, players);
}
public void setPanelSelection(Card c) {
GuiUtils.setPanelSelection(c);
}
public SpellAbility getAbilityToPlay(List<SpellAbility> abilities, Object triggerEvent) {
if (triggerEvent == null) {
if (abilities.isEmpty()) {
return null;
}
if (abilities.size() == 1) {
return abilities.get(0);
}
return GuiChoose.oneOrNone("Choose ability to play", abilities);
}
if (abilities.isEmpty()) {
return null;
}
if (abilities.size() == 1 && !abilities.get(0).promptIfOnlyPossibleAbility()) {
if (abilities.get(0).canPlay()) {
return abilities.get(0); //only return ability if it's playable, otherwise return null
}
return null;
}
//show menu if mouse was trigger for ability
final JPopupMenu menu = new JPopupMenu("Abilities");
boolean enabled;
boolean hasEnabled = false;
int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9
for (final SpellAbility ab : abilities) {
enabled = ab.canPlay();
if (enabled) {
hasEnabled = true;
}
GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(ab.toString(), true),
shortcut > 0 ? KeyStroke.getKeyStroke(shortcut, 0) : null,
new Runnable() {
@Override
public void run() {
CPrompt.SINGLETON_INSTANCE.getInputControl().selectAbility(ab);
}
}, enabled);
if (shortcut > 0) {
shortcut++;
if (shortcut > KeyEvent.VK_9) {
shortcut = 0; //stop adding shortcuts after 9
}
}
}
if (hasEnabled) { //only show menu if at least one ability can be played
SwingUtilities.invokeLater(new Runnable() { //use invoke later to ensure first ability selected by default
public void run() {
MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, menu.getSubElements()[0]});
}
});
MouseEvent mouseEvent = (MouseEvent) triggerEvent;
menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
}
return null; //delay ability until choice made
}
public void hear(LobbyPlayer player, String message) {
FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message);
}
public int getAvatarCount() {
if (FSkin.isLoaded()) {
FSkin.getAvatars().size();
}
return 0;
}
@Override
public int showOptionDialog(String message, String title, FSkinProp icon, String[] options, int defaultOption) {
return FOptionPane.showOptionDialog(message, title, FSkin.getImage(icon), options, defaultOption);
}
@Override
public <T> T showInputDialog(String message, String title, FSkinProp icon, T initialInput, T[] inputOptions) {
return FOptionPane.showInputDialog(message, title, FSkin.getImage(icon), initialInput, inputOptions);
}
@Override
public void fireEvent(UiEvent e) {
CMatchUI.SINGLETON_INSTANCE.fireEvent(e);
}
@Override
public void setCard(Card card) {
CMatchUI.SINGLETON_INSTANCE.setCard(card);
}
@Override
public void showCombat(Combat combat) {
CMatchUI.SINGLETON_INSTANCE.showCombat(combat);
}
@Override
public void setUsedToPay(Card card, boolean b) {
CMatchUI.SINGLETON_INSTANCE.setUsedToPay(card, b);
}
@Override
public void setHighlighted(Player player, boolean b) {
CMatchUI.SINGLETON_INSTANCE.setHighlighted(player, b);
}
@Override
public void showPromptMessage(String message) {
CMatchUI.SINGLETON_INSTANCE.showMessage(message);
}
@Override
public boolean stopAtPhase(Player playerTurn, PhaseType phase) {
return CMatchUI.SINGLETON_INSTANCE.stopAtPhase(playerTurn, phase);
}
@Override
public InputQueue getInputQueue() {
return FControl.instance.getInputQueue();
}
@Override
public Game getGame() {
return FControl.instance.getObservedGame();
}
@Override
public void updateZones(List<Pair<Player, ZoneType>> zonesToUpdate) {
CMatchUI.SINGLETON_INSTANCE.updateZones(zonesToUpdate);
}
@Override
public void updateCards(Set<Card> cardsToUpdate) {
CMatchUI.SINGLETON_INSTANCE.updateCards(cardsToUpdate);
}
@Override
public void updateManaPool(List<Player> manaPoolUpdate) {
CMatchUI.SINGLETON_INSTANCE.updateManaPool(manaPoolUpdate);
}
@Override
public void updateLives(List<Player> livesUpdate) {
CMatchUI.SINGLETON_INSTANCE.updateLives(livesUpdate);
}
@Override
public void endCurrentGame() {
FControl.instance.endCurrentGame();
}
@Override
public Map<Card, Integer> getDamageToAssign(Card attacker, List<Card> blockers,
int damageDealt, GameEntity defender, boolean overrideOrder) {
return CMatchUI.SINGLETON_INSTANCE.getDamageToAssign(attacker, blockers,
damageDealt, defender, overrideOrder);
}
}

View File

@@ -1,339 +1,218 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
import com.google.common.cache.LoadingCache;
import com.mortennobel.imagescaling.ResampleOp;
import forge.card.CardDb;
import forge.card.CardRules;
import forge.card.CardSplitType;
import forge.game.card.Card;
import forge.game.player.IHasIcon;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinIcon;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants;
import forge.util.Base64Coder;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutionException;
/**
* This class stores ALL card images in a cache with soft values. this means
* that the images may be collected when they are not needed any more, but will
* be kept as long as possible.
* <p/>
* The keys are the following:
* <ul>
* <li>Keys start with the file name, extension is skipped</li>
* <li>The key without suffix belongs to the unmodified image from the file</li>
* </ul>
*
* @author Forge
* @version $Id$
*/
public class ImageCache {
// short prefixes to save memory
private static final Set<String> _missingIconKeys = new HashSet<String>();
private static final LoadingCache<String, BufferedImage> _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader());
private static final BufferedImage _defaultImage;
static {
BufferedImage defImage = null;
try {
defImage = ImageIO.read(new File(NewConstants.NO_CARD_FILE));
} catch (Exception ex) {
System.err.println("could not load default card image");
} finally {
_defaultImage = (null == defImage) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : defImage;
}
}
public static void clear() {
_CACHE.invalidateAll();
_missingIconKeys.clear();
}
/**
* retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(Card card, int width, int height) {
final String key;
if (!Singletons.getControl().mayShowCard(card) || card.isFaceDown()) {
key = ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE;
} else {
key = card.getImageKey();
}
return scaleImage(key, width, height, true);
}
/**
* retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(InventoryItem ii, int width, int height) {
return scaleImage(ImageKeys.getImageKey(ii, false), width, height, true);
}
/**
* retrieve an icon from the cache. returns the current skin's ICO_UNKNOWN if the icon image is not found
* in the cache and cannot be loaded from disk.
*/
public static SkinIcon getIcon(IHasIcon ihi) {
String imageKey = ihi.getIconImageKey();
final BufferedImage i;
if (_missingIconKeys.contains(imageKey) ||
null == (i = scaleImage(ihi.getIconImageKey(), -1, -1, false))) {
_missingIconKeys.add(imageKey);
return FSkin.getIcon(FSkin.InterfaceIcons.ICO_UNKNOWN);
}
return new FSkin.UnskinnedIcon(i);
}
/**
* This requests the original unscaled image from the cache for the given key.
* If the image does not exist then it can return a default image if desired.
* <p>
* If the requested image is not present in the cache then it attempts to load
* the image from file (slower) and then add it to the cache for fast future access.
* </p>
*/
public static BufferedImage getOriginalImage(String imageKey, boolean useDefaultIfNotFound) {
if (null == imageKey) {
return null;
}
boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX);
if(altState)
imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length());
if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) {
imageKey = getImageKey(getPaperCardFromImageKey(imageKey.substring(2)), altState, true);
if (StringUtils.isBlank(imageKey)) {
return _defaultImage;
}
}
// Load from file and add to cache if not found in cache initially.
BufferedImage original = getImage(imageKey);
// No image file exists for the given key so optionally associate with
// a default "not available" image and add to cache for given key.
if (original == null) {
if (useDefaultIfNotFound) {
original = _defaultImage;
_CACHE.put(imageKey, _defaultImage);
} else {
original = null;
}
}
return original;
}
private static PaperCard getPaperCardFromImageKey(String key) {
if( key == null )
return null;
PaperCard cp = StaticData.instance().getCommonCards().getCard(key);
if ( cp == null )
cp = StaticData.instance().getVariantCards().getCard(key);
return cp;
}
private static BufferedImage scaleImage(String key, final int width, final int height, boolean useDefaultImage) {
if (StringUtils.isEmpty(key) || (3 > width && -1 != width) || (3 > height && -1 != height)) {
// picture too small or key not defined; return a blank
return null;
}
String resizedKey = String.format("%s#%dx%d", key, width, height);
final BufferedImage cached = _CACHE.getIfPresent(resizedKey);
if (null != cached) {
//System.out.println("found cached image: " + resizedKey);
return cached;
}
BufferedImage original = getOriginalImage(key, useDefaultImage);
if (original == null) { return null; }
// Calculate the scale required to best fit the image into the requested
// (width x height) dimensions whilst retaining aspect ratio.
double scaleX = (-1 == width ? 1 : (double)width / original.getWidth());
double scaleY = (-1 == height? 1 : (double)height / original.getHeight());
double bestFitScale = Math.min(scaleX, scaleY);
if ((bestFitScale > 1) && !mayEnlarge()) {
bestFitScale = 1;
}
BufferedImage result;
if (1 == bestFitScale) {
result = original;
} else {
int destWidth = (int)(original.getWidth() * bestFitScale);
int destHeight = (int)(original.getHeight() * bestFitScale);
ResampleOp resampler = new ResampleOp(destWidth, destHeight);
result = resampler.filter(original, null);
}
//System.out.println("caching image: " + resizedKey);
_CACHE.put(resizedKey, result);
return result;
}
private static boolean mayEnlarge() {
return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER);
}
/**
* Returns the Image corresponding to the key.
*/
private static BufferedImage getImage(final String key) {
FThreads.assertExecutedByEdt(true);
try {
return ImageCache._CACHE.get(key);
} catch (final ExecutionException ex) {
if (ex.getCause() instanceof NullPointerException) {
return null;
}
ex.printStackTrace();
return null;
} catch (final InvalidCacheLoadException ex) {
// should be when a card legitimately has no image
return null;
}
}
private static String getImageRelativePath(PaperCard cp, boolean backFace, boolean includeSet, boolean isDownloadUrl) {
final String nameToUse = cp == null ? null : getNameToUse(cp, backFace);
if ( null == nameToUse )
return null;
StringBuilder s = new StringBuilder();
CardRules card = cp.getRules();
String edition = cp.getEdition();
s.append(ImageCache.toMWSFilename(nameToUse));
final int cntPictures;
final boolean hasManyPictures;
final CardDb db = !card.isVariant() ? Singletons.getMagicDb().getCommonCards() : Singletons.getMagicDb().getVariantCards();
if (includeSet) {
cntPictures = db.getPrintCount(card.getName(), edition);
hasManyPictures = cntPictures > 1;
} else {
// without set number of pictures equals number of urls provided in Svar:Picture
String urls = card.getPictureUrl(backFace);
cntPictures = StringUtils.countMatches(urls, "\\") + 1;
// raise the art index limit to the maximum of the sets this card was printed in
int maxCntPictures = db.getMaxPrintCount(card.getName());
hasManyPictures = maxCntPictures > 1;
}
int artIdx = cp.getArtIndex() - 1;
if (hasManyPictures) {
if ( cntPictures <= artIdx ) // prevent overflow
artIdx = cntPictures == 0 ? 0 : artIdx % cntPictures;
s.append(artIdx + 1);
}
// for whatever reason, MWS-named plane cards don't have the ".full" infix
if (!card.getType().isPlane() && !card.getType().isPhenomenon()) {
s.append(".full");
}
final String fname;
if (isDownloadUrl) {
s.append(".jpg");
fname = Base64Coder.encodeString(s.toString(), true);
} else {
fname = s.toString();
}
if (includeSet) {
String editionAliased = isDownloadUrl ? Singletons.getMagicDb().getEditions().getCode2ByCode(edition) : getSetFolder(edition);
return String.format("%s/%s", editionAliased, fname);
} else {
return fname;
}
}
public static boolean hasBackFacePicture(PaperCard cp) {
CardSplitType cst = cp.getRules().getSplitType();
return cst == CardSplitType.Transform || cst == CardSplitType.Flip;
}
public static String getSetFolder(String edition) {
return !NewConstants.CACHE_CARD_PICS_SUBDIR.containsKey(edition)
? Singletons.getMagicDb().getEditions().getCode2ByCode(edition) // by default 2-letter codes from MWS are used
: NewConstants.CACHE_CARD_PICS_SUBDIR.get(edition); // may use custom paths though
}
private static String getNameToUse(PaperCard cp, boolean backFace) {
final CardRules card = cp.getRules();
if (backFace ) {
if ( hasBackFacePicture(cp) )
return card.getOtherPart().getName();
else
return null;
} else if(CardSplitType.Split == cp.getRules().getSplitType()) {
return card.getMainPart().getName() + card.getOtherPart().getName();
} else {
return cp.getName();
}
}
public static String getImageKey(PaperCard cp, boolean backFace, boolean includeSet) {
return getImageRelativePath(cp, backFace, includeSet, false);
}
public static String getDownloadUrl(PaperCard cp, boolean backFace) {
return getImageRelativePath(cp, backFace, true, true);
}
public static String toMWSFilename(String in) {
final StringBuffer out = new StringBuffer();
char c;
for (int i = 0; i < in.length(); i++) {
c = in.charAt(i);
if ((c == '"') || (c == '/') || (c == ':') || (c == '?')) {
out.append("");
} else {
out.append(c);
}
}
return out.toString();
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
import com.google.common.cache.LoadingCache;
import com.mortennobel.imagescaling.ResampleOp;
import forge.assets.FSkinProp;
import forge.assets.ImageUtil;
import forge.game.card.Card;
import forge.game.player.IHasIcon;
import forge.item.InventoryItem;
import forge.properties.ForgeConstants;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinIcon;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutionException;
/**
* This class stores ALL card images in a cache with soft values. this means
* that the images may be collected when they are not needed any more, but will
* be kept as long as possible.
* <p/>
* The keys are the following:
* <ul>
* <li>Keys start with the file name, extension is skipped</li>
* <li>The key without suffix belongs to the unmodified image from the file</li>
* </ul>
*
* @author Forge
* @version $Id: ImageCache.java 25093 2014-03-08 05:36:37Z drdev $
*/
public class ImageCache {
// short prefixes to save memory
private static final Set<String> _missingIconKeys = new HashSet<String>();
private static final LoadingCache<String, BufferedImage> _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader());
private static final BufferedImage _defaultImage;
static {
BufferedImage defImage = null;
try {
defImage = ImageIO.read(new File(ForgeConstants.NO_CARD_FILE));
} catch (Exception ex) {
System.err.println("could not load default card image");
} finally {
_defaultImage = (null == defImage) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : defImage;
}
}
public static void clear() {
_CACHE.invalidateAll();
_missingIconKeys.clear();
}
/**
* retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(Card card, int width, int height) {
final String key;
if (!Singletons.getControl().mayShowCard(card) || card.isFaceDown()) {
key = ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE;
} else {
key = card.getImageKey();
}
return scaleImage(key, width, height, true);
}
/**
* retrieve an image from the cache. returns null if the image is not found in the cache
* and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension.
*/
public static BufferedImage getImage(InventoryItem ii, int width, int height) {
return scaleImage(ImageKeys.getImageKey(ii, false), width, height, true);
}
/**
* retrieve an icon from the cache. returns the current skin's ICO_UNKNOWN if the icon image is not found
* in the cache and cannot be loaded from disk.
*/
public static SkinIcon getIcon(IHasIcon ihi) {
String imageKey = ihi.getIconImageKey();
final BufferedImage i;
if (_missingIconKeys.contains(imageKey) ||
null == (i = scaleImage(ihi.getIconImageKey(), -1, -1, false))) {
_missingIconKeys.add(imageKey);
return FSkin.getIcon(FSkinProp.ICO_UNKNOWN);
}
return new FSkin.UnskinnedIcon(i);
}
/**
* This requests the original unscaled image from the cache for the given key.
* If the image does not exist then it can return a default image if desired.
* <p>
* If the requested image is not present in the cache then it attempts to load
* the image from file (slower) and then add it to the cache for fast future access.
* </p>
*/
public static BufferedImage getOriginalImage(String imageKey, boolean useDefaultIfNotFound) {
if (null == imageKey) {
return null;
}
boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX);
if(altState)
imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length());
if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) {
imageKey = ImageUtil.getImageKey(ImageUtil.getPaperCardFromImageKey(imageKey.substring(2)), altState, true);
if (StringUtils.isBlank(imageKey)) {
return _defaultImage;
}
}
// Load from file and add to cache if not found in cache initially.
BufferedImage original = getImage(imageKey);
// No image file exists for the given key so optionally associate with
// a default "not available" image and add to cache for given key.
if (original == null) {
if (useDefaultIfNotFound) {
original = _defaultImage;
_CACHE.put(imageKey, _defaultImage);
} else {
original = null;
}
}
return original;
}
private static BufferedImage scaleImage(String key, final int width, final int height, boolean useDefaultImage) {
if (StringUtils.isEmpty(key) || (3 > width && -1 != width) || (3 > height && -1 != height)) {
// picture too small or key not defined; return a blank
return null;
}
String resizedKey = String.format("%s#%dx%d", key, width, height);
final BufferedImage cached = _CACHE.getIfPresent(resizedKey);
if (null != cached) {
//System.out.println("found cached image: " + resizedKey);
return cached;
}
BufferedImage original = getOriginalImage(key, useDefaultImage);
if (original == null) { return null; }
// Calculate the scale required to best fit the image into the requested
// (width x height) dimensions whilst retaining aspect ratio.
double scaleX = (-1 == width ? 1 : (double)width / original.getWidth());
double scaleY = (-1 == height? 1 : (double)height / original.getHeight());
double bestFitScale = Math.min(scaleX, scaleY);
if ((bestFitScale > 1) && !ImageUtil.mayEnlarge()) {
bestFitScale = 1;
}
BufferedImage result;
if (1 == bestFitScale) {
result = original;
} else {
int destWidth = (int)(original.getWidth() * bestFitScale);
int destHeight = (int)(original.getHeight() * bestFitScale);
ResampleOp resampler = new ResampleOp(destWidth, destHeight);
result = resampler.filter(original, null);
}
//System.out.println("caching image: " + resizedKey);
_CACHE.put(resizedKey, result);
return result;
}
/**
* Returns the Image corresponding to the key.
*/
private static BufferedImage getImage(final String key) {
FThreads.assertExecutedByEdt(true);
try {
return ImageCache._CACHE.get(key);
} catch (final ExecutionException ex) {
if (ex.getCause() instanceof NullPointerException) {
return null;
}
ex.printStackTrace();
return null;
} catch (final InvalidCacheLoadException ex) {
// should be when a card legitimately has no image
return null;
}
}
}

View File

@@ -1,11 +1,15 @@
package forge;
import com.google.common.cache.CacheLoader;
import forge.assets.ImageUtil;
import forge.error.BugReporter;
import forge.properties.NewConstants;
import forge.properties.ForgeConstants;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -25,34 +29,34 @@ final class ImageLoader extends CacheLoader<String, BufferedImage> {
final String filename;
if (key.startsWith(ImageKeys.TOKEN_PREFIX)) {
filename = key.substring(ImageKeys.TOKEN_PREFIX.length());
path = NewConstants.CACHE_TOKEN_PICS_DIR;
path = ForgeConstants.CACHE_TOKEN_PICS_DIR;
} else if (key.startsWith(ImageKeys.ICON_PREFIX)) {
filename = key.substring(ImageKeys.ICON_PREFIX.length());
path = NewConstants.CACHE_ICON_PICS_DIR;
path = ForgeConstants.CACHE_ICON_PICS_DIR;
} else if (key.startsWith(ImageKeys.BOOSTER_PREFIX)) {
filename = key.substring(ImageKeys.BOOSTER_PREFIX.length());
path = NewConstants.CACHE_BOOSTER_PICS_DIR;
path = ForgeConstants.CACHE_BOOSTER_PICS_DIR;
} else if (key.startsWith(ImageKeys.FATPACK_PREFIX)) {
filename = key.substring(ImageKeys.FATPACK_PREFIX.length());
path = NewConstants.CACHE_FATPACK_PICS_DIR;
path = ForgeConstants.CACHE_FATPACK_PICS_DIR;
} else if (key.startsWith(ImageKeys.PRECON_PREFIX)) {
filename = key.substring(ImageKeys.PRECON_PREFIX.length());
path = NewConstants.CACHE_PRECON_PICS_DIR;
path = ForgeConstants.CACHE_PRECON_PICS_DIR;
} else if (key.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX)) {
filename = key.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length());
path = NewConstants.CACHE_TOURNAMENTPACK_PICS_DIR;
path = ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR;
} else {
filename = key;
path = NewConstants.CACHE_CARD_PICS_DIR;
path = ForgeConstants.CACHE_CARD_PICS_DIR;
}
BufferedImage ret = _findFile(key, path, filename);
// some S00 cards are really part of 6ED
if (null == ret ) {
String s2kAlias = ImageCache.getSetFolder("S00");
String s2kAlias = ImageUtil.getSetFolder("S00");
if ( filename.startsWith(s2kAlias) ) {
ret = _findFile(key, path, filename.replace(s2kAlias, ImageCache.getSetFolder("6ED")));
ret = _findFile(key, path, filename.replace(s2kAlias, ImageUtil.getSetFolder("6ED")));
}
}

View File

@@ -1,90 +1,62 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge;
import forge.control.FControl;
import forge.gui.toolbox.FProgressBar;
import forge.gui.workshop.CardScriptInfo;
import forge.model.FModel;
import forge.properties.NewConstants;
import forge.view.FView;
/**
* Provides global/static access to singleton instances.
*/
public final class Singletons {
private static boolean initialized = false;
private static FModel model = null;
private static FView view = null;
private static FControl control = null;
private static StaticData magicDb = null;
/**
* IMPORTANT - does not return view frame! Must call
* getFrame() from FView for that.
*/
public static FView getView() { return view; }
public static FControl getControl() { return control; }
public static FModel getModel() { return model; }
public static StaticData getMagicDb() { return magicDb; }
public static void initializeOnce(boolean withUi) {
FThreads.assertExecutedByEdt(false);
synchronized (Singletons.class) {
if(initialized)
throw new IllegalStateException("Singletons.initializeOnce really cannot be called again");
initialized = true;
}
if (withUi) {
view = FView.SINGLETON_INSTANCE;
}
CardStorageReader.ProgressObserver progressBarBridge = view == null
? CardStorageReader.ProgressObserver.emptyObserver : new CardStorageReader.ProgressObserver() {
FProgressBar bar = view.getSplash().getProgressBar();
@Override
public void setOperationName(final String name, final boolean usePercents) {
FThreads.invokeInEdtLater(new Runnable() { @Override public void run() {
bar.setDescription(name);
bar.setPercentMode(usePercents);
} });
}
@Override
public void report(int current, int total) {
if ( total != bar.getMaximum())
bar.setMaximum(total);
bar.setValueThreadSafe(current);
}
};
// Loads all cards (using progress bar).
final CardStorageReader reader = new CardStorageReader(NewConstants.CARD_DATA_DIR, progressBarBridge, CardScriptInfo.readerObserver);
magicDb = new StaticData(reader, "res/editions", "res/blockdata");
model = FModel.getInstance(withUi);
if (withUi) {
control = FControl.instance;
}
}
// disallow instantiation
private Singletons() { }
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge;
import forge.control.FControl;
import forge.model.FModel;
import forge.view.FView;
/**
* Provides global/static access to singleton instances.
*/
public final class Singletons {
private static boolean initialized = false;
private static FView view = null;
private static FControl control = null;
/**
* IMPORTANT - does not return view frame! Must call
* getFrame() from FView for that.
*/
public static FView getView() { return view; }
public static FControl getControl() { return control; }
public static void initializeOnce(boolean withUi) {
FThreads.assertExecutedByEdt(false);
synchronized (Singletons.class) {
if (initialized) {
throw new IllegalStateException("Singletons.initializeOnce really cannot be called again");
}
initialized = true;
}
if (withUi) {
view = FView.SINGLETON_INSTANCE;
}
FModel.initialize(view == null ? null : view.getSplash().getProgressBar());
if (withUi) {
control = FControl.instance;
}
}
// disallow instantiation
private Singletons() { }
}

View File

@@ -21,8 +21,8 @@ import forge.FThreads;
import forge.ImageCache;
import forge.Singletons;
import forge.ai.LobbyPlayerAi;
import forge.assets.FSkinProp;
import forge.control.KeyboardShortcuts.Shortcut;
import forge.deck.io.DeckPreferences;
import forge.game.Game;
import forge.game.GameRules;
import forge.game.GameType;
@@ -31,33 +31,35 @@ import forge.game.card.Card;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.RegisteredPlayer;
import forge.gui.CardPreferences;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.framework.*;
import forge.gui.home.settings.GamePlayerUtil;
import forge.gui.match.CMatchUI;
import forge.gui.match.VMatchUI;
import forge.gui.match.controllers.CDock;
import forge.gui.match.controllers.CLog;
import forge.gui.match.controllers.CPrompt;
import forge.gui.match.controllers.CStack;
import forge.gui.match.views.VAntes;
import forge.gui.match.views.VField;
import forge.gui.menus.ForgeMenu;
import forge.gui.player.LobbyPlayerHuman;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.ItemManagerConfig;
import forge.player.GamePlayerUtil;
import forge.player.LobbyPlayerHuman;
import forge.match.input.InputQueue;
import forge.menus.ForgeMenu;
import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants;
import forge.properties.ForgeConstants;
import forge.quest.QuestController;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.io.QuestDataIO;
import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.match.CMatchUI;
import forge.screens.match.VMatchUI;
import forge.screens.match.controllers.CDock;
import forge.screens.match.controllers.CLog;
import forge.screens.match.controllers.CPrompt;
import forge.screens.match.controllers.CStack;
import forge.screens.match.views.VAntes;
import forge.screens.match.views.VDev;
import forge.screens.match.views.VField;
import forge.sound.SoundSystem;
import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin;
import forge.toolbox.special.PhaseIndicator;
import forge.view.FFrame;
import forge.view.FView;
@@ -155,7 +157,7 @@ public enum FControl implements KeyEventDispatcher {
this.closeAction = closeAction0;
Singletons.getView().getNavigationBar().updateBtnCloseTooltip();
final ForgePreferences prefs = Singletons.getModel().getPreferences();
final ForgePreferences prefs = FModel.getPreferences();
prefs.setPref(FPref.UI_CLOSE_ACTION, closeAction0.toString());
prefs.save();
}
@@ -190,24 +192,20 @@ public enum FControl implements KeyEventDispatcher {
// Preloads skin components (using progress bar).
FSkin.loadFull(true);
CardPreferences.load(NewConstants.CARD_PREFS_FILE);
DeckPreferences.load(NewConstants.DECK_PREFS_FILE);
ItemManagerConfig.load(NewConstants.ITEM_VIEW_PREFS_FILE);
this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
this.display = FView.SINGLETON_INSTANCE.getLpnDocument();
final ForgePreferences prefs = Singletons.getModel().getPreferences();
final ForgePreferences prefs = FModel.getPreferences();
this.closeAction = CloseAction.valueOf(prefs.getPref(FPref.UI_CLOSE_ACTION));
FView.SINGLETON_INSTANCE.setSplashProgessBarMessage("About to load current quest.");
// Preload quest data if present
final File dirQuests = new File(NewConstants.QUEST_SAVE_DIR);
final String questname = Singletons.getModel().getQuestPreferences().getPref(QPref.CURRENT_QUEST);
final File dirQuests = new File(ForgeConstants.QUEST_SAVE_DIR);
final String questname = FModel.getQuestPreferences().getPref(QPref.CURRENT_QUEST);
final File data = new File(dirQuests.getPath(), questname);
if (data.exists()) {
Singletons.getModel().getQuest().load(QuestDataIO.loadData(data));
FModel.getQuest().load(QuestDataIO.loadData(data));
}
// Handles resizing in null layouts of layers in JLayeredPane as well as saving window layout
@@ -301,7 +299,7 @@ public enum FControl implements KeyEventDispatcher {
if (screen == FScreen.MATCH_SCREEN) {
if (isMatchBackgroundImageVisible()) {
FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(FSkin.getIcon(FSkin.Backgrounds.BG_MATCH));
FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(FSkin.getIcon(FSkinProp.BG_MATCH));
}
SOverlayUtils.showTargetingOverlay();
}
@@ -311,7 +309,7 @@ public enum FControl implements KeyEventDispatcher {
}
private boolean isMatchBackgroundImageVisible() {
return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MATCH_IMAGE_VISIBLE);
return FModel.getPreferences().getPrefBoolean(FPref.UI_MATCH_IMAGE_VISIBLE);
}
public boolean ensureScreenActive(FScreen screen) {
@@ -349,13 +347,13 @@ public enum FControl implements KeyEventDispatcher {
public Player getCurrentPlayer() {
// try current priority
Player currentPriority = game.getPhaseHandler().getPriorityPlayer();
if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer()) {
if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) {
return currentPriority;
}
// otherwise find just any player, belonging to this lobbyplayer
for (Player p : game.getPlayers()) {
if (p.getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer()) {
if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) {
return p;
}
}
@@ -385,7 +383,7 @@ public enum FControl implements KeyEventDispatcher {
public final void stopGame() {
List<Player> pp = new ArrayList<Player>();
for (Player p : game.getPlayers()) {
if (p.getOriginalLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer()) {
if (p.getOriginalLobbyPlayer() == FServer.getLobby().getGuiPlayer()) {
pp.add(p);
}
}
@@ -400,7 +398,7 @@ public enum FControl implements KeyEventDispatcher {
}
Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer();
boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer();
boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer();
if (hasHuman && humanHasPriority) {
game.getAction().checkGameOverCondition();
@@ -446,11 +444,11 @@ public enum FControl implements KeyEventDispatcher {
this.game = null;
}
private final FControlGameEventHandler fcVisitor = new FControlGameEventHandler(this);
private final FControlGamePlayback playbackControl = new FControlGamePlayback(this);
private final FControlGameEventHandler fcVisitor = new FControlGameEventHandler();
private final FControlGamePlayback playbackControl = new FControlGamePlayback();
private void attachToGame(Game game0) {
if (game0.getRules().getGameType() == GameType.Quest) {
QuestController qc = Singletons.getModel().getQuest();
QuestController qc = FModel.getQuest();
// Reset new list when the Match round starts, not when each game starts
if (game0.getMatch().getPlayedGames().isEmpty()) {
qc.getCards().resetNewList();
@@ -463,14 +461,14 @@ public enum FControl implements KeyEventDispatcher {
this.game = game0;
game.subscribeToEvents(Singletons.getControl().getSoundSystem());
LobbyPlayer humanLobbyPlayer = FServer.instance.getLobby().getGuiPlayer();
LobbyPlayer humanLobbyPlayer = FServer.getLobby().getGuiPlayer();
// The UI controls should use these game data as models
CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer);
CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer);
CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer);
CLog.SINGLETON_INSTANCE.setModel(game.getGameLog());
Singletons.getModel().getPreferences().actuateMatchPreferences();
actuateMatchPreferences();
VAntes.SINGLETON_INSTANCE.setModel(game.getRegisteredPlayers());
setCurrentScreen(FScreen.MATCH_SCREEN);
@@ -484,7 +482,7 @@ public enum FControl implements KeyEventDispatcher {
// Add playback controls to match if needed
gameHasHumanPlayer = false;
for (Player p : game.getPlayers()) {
if (p.getController().getLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer())
if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer())
gameHasHumanPlayer = true;
}
@@ -492,8 +490,6 @@ public enum FControl implements KeyEventDispatcher {
game.subscribeToEvents(playbackControl);
}
for (final VField field : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) {
field.getDetailsPanel().getLblLibrary().setHoverable(ForgePreferences.DEV_MODE);
}
@@ -545,7 +541,7 @@ public enum FControl implements KeyEventDispatcher {
* PLAYER_NAME setting is blank. Does not apply to a hotseat game.
*/
private void setPlayerName(List<RegisteredPlayer> players) {
final ForgePreferences prefs = Singletons.getModel().getPreferences();
final ForgePreferences prefs = FModel.getPreferences();
if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) {
boolean isPlayerOneHuman = players.get(0).getPlayer() instanceof LobbyPlayerHuman;
boolean isPlayerTwoComputer = players.get(1).getPlayer() instanceof LobbyPlayerAi;
@@ -560,7 +556,7 @@ public enum FControl implements KeyEventDispatcher {
}
public void startMatch(GameType gameType, List<GameType> appliedVariants, List<RegisteredPlayer> players) {
boolean useRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);
boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);
for(RegisteredPlayer rp : players) {
rp.setRandomFoil(useRandomFoil);
}
@@ -568,9 +564,9 @@ public enum FControl implements KeyEventDispatcher {
GameRules rules = new GameRules(gameType);
if (null != appliedVariants && !appliedVariants.isEmpty())
rules.setAppliedVariants(appliedVariants);
rules.setPlayForAnte(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE));
rules.setManaBurn(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN));
rules.canCloneUseTargetsImage = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
rules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE));
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
final Match mc = new Match(rules, players);
SOverlayUtils.startGameOverlay();
@@ -583,5 +579,95 @@ public enum FControl implements KeyEventDispatcher {
}
});
}
/**
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
* codebase.
*/
public void writeMatchPreferences() {
final ForgePreferences prefs = FModel.getPreferences();
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
// AI field is at index [1]
PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator();
prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled()));
prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled()));
prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled()));
prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLblBeginCombat().getEnabled()));
prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLblDeclareAttackers().getEnabled()));
prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLblDeclareBlockers().getEnabled()));
prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLblFirstStrike().getEnabled()));
prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLblCombatDamage().getEnabled()));
prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLblEndCombat().getEnabled()));
prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLblMain2().getEnabled()));
prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLblEndTurn().getEnabled()));
prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled()));
// Human field is at index [0]
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLblBeginCombat().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLblDeclareAttackers().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLblDeclareBlockers().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLblFirstStrike().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLblCombatDamage().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLblEndCombat().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLblMain2().getEnabled()));
prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLblEndTurn().getEnabled());
prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLblCleanup().getEnabled());
final VDev v = VDev.SINGLETON_INSTANCE;
// prefs.setPref(FPref.DEV_MILLING_LOSS, v.getLblMilling().getEnabled());
prefs.setPref(FPref.DEV_UNLIMITED_LAND, v.getLblUnlimitedLands().getEnabled());
prefs.save();
}
/**
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
* codebase.
*/
public void actuateMatchPreferences() {
final ForgePreferences prefs = FModel.getPreferences();
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
ForgePreferences.DEV_MODE = prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED);
ForgePreferences.UPLOAD_DRAFT = ForgePreferences.NET_CONN; // && prefs.getPrefBoolean(FPref.UI_UPLOAD_DRAFT);
// AI field is at index [0]
PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator();
fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
fvAi.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT));
fvAi.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS));
fvAi.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS));
fvAi.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE));
fvAi.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE));
fvAi.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT));
fvAi.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2));
fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
// Human field is at index [1]
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
fvHuman.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT));
fvHuman.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS));
fvHuman.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS));
fvHuman.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE));
fvHuman.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE));
fvHuman.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT));
fvHuman.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2));
fvHuman.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
fvHuman.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP));
//Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS));
}
}

View File

@@ -4,13 +4,16 @@ import forge.Singletons;
import forge.gui.framework.EDocID;
import forge.gui.framework.FScreen;
import forge.gui.framework.SDisplayUtil;
import forge.gui.home.settings.VSubmenuPreferences.KeyboardShortcutField;
import forge.gui.match.CMatchUI;
import forge.gui.match.controllers.CDock;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.screens.home.settings.VSubmenuPreferences.KeyboardShortcutField;
import forge.screens.match.CMatchUI;
import forge.screens.match.controllers.CDock;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
@@ -82,7 +85,7 @@ public class KeyboardShortcuts {
@Override
public void actionPerformed(final ActionEvent e) {
if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; }
if (Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED)) {
if (FModel.getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED)) {
SDisplayUtil.showTab(EDocID.DEV_MODE.getDoc());
}
}
@@ -197,7 +200,7 @@ public class KeyboardShortcuts {
/** */
public void attach() {
detach();
str = Singletons.getModel().getPreferences().getPref(prefkeys);
str = FModel.getPreferences().getPref(prefkeys);
if (!str.isEmpty()) {
key = assembleKeystrokes(str.split(" "));

View File

@@ -0,0 +1,3 @@
/** Controller (as in model-view-controller) for Forge. */
package forge.control;

View File

@@ -1,10 +1,10 @@
package forge.gui.deckchooser;
package forge.deckchooser;
import forge.deck.DeckType;
import forge.gui.MouseUtil;
import forge.gui.deckchooser.DecksComboBox.DeckType;
import forge.gui.toolbox.FComboBox.TextAlignment;
import forge.gui.toolbox.FComboBoxWrapper;
import forge.gui.toolbox.FSkin;
import forge.toolbox.FComboBoxWrapper;
import forge.toolbox.FSkin;
import forge.toolbox.FComboBox.TextAlignment;
import javax.swing.*;
@@ -15,32 +15,6 @@ import java.util.ArrayList;
import java.util.List;
public class DecksComboBox extends FComboBoxWrapper<DeckType> {
public enum DeckType {
CUSTOM_DECK ("Custom User Decks"),
PRECONSTRUCTED_DECK("Preconstructed Decks"),
QUEST_OPPONENT_DECK ("Quest Opponent Decks"),
COLOR_DECK ("Random Color Decks"),
THEME_DECK ("Random Theme Decks");
private String value;
private DeckType(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
public static DeckType fromString(String value){
for (final DeckType d : DeckType.values()) {
if (d.toString().equalsIgnoreCase(value)) {
return d;
}
}
throw new IllegalArgumentException("No Enum specified for this string");
}
};
private List<IDecksComboBoxListener> _listeners = new ArrayList<>();
private DeckType selectedDeckType = null;

View File

@@ -0,0 +1,19 @@
package forge.deckchooser;
import java.util.EventObject;
import forge.deck.DeckType;
@SuppressWarnings("serial")
public class DecksComboBoxEvent extends EventObject {
private final DeckType deckType;
public DecksComboBoxEvent(Object source, DeckType deckType0) {
super(source);
deckType = deckType0;
}
public DeckType getDeckType() {
return deckType;
}
}

View File

@@ -1,22 +1,23 @@
package forge.gui.deckchooser;
package forge.deckchooser;
import forge.UiCommand;
import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckProxy;
import forge.deck.DeckType;
import forge.deck.DeckgenUtil;
import forge.game.GameType;
import forge.game.player.RegisteredPlayer;
import forge.gui.deckchooser.DecksComboBox.DeckType;
import forge.gui.deckeditor.DeckProxy;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.itemmanager.DeckManager;
import forge.gui.toolbox.itemmanager.ItemManagerConfig;
import forge.gui.toolbox.itemmanager.ItemManagerContainer;
import forge.itemmanager.DeckManager;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.ItemManagerContainer;
import forge.model.FModel;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController;
import forge.quest.QuestEvent;
import forge.quest.QuestEventChallenge;
import forge.quest.QuestUtil;
import forge.toolbox.FLabel;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
@@ -39,7 +40,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private boolean isAi;
private final ForgePreferences prefs = Singletons.getModel().getPreferences();
private final ForgePreferences prefs = FModel.getPreferences();
private FPref stateSetting = null;
public FDeckChooser(boolean forAi) {
@@ -78,7 +79,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private void updateCustom() {
lstDecks.setAllowMultipleSelections(false);
lstDecks.setPool(DeckProxy.getAllConstructedDecks(Singletons.getModel().getDecks().getConstructed()));
lstDecks.setPool(DeckProxy.getAllConstructedDecks(FModel.getDecks().getConstructed()));
lstDecks.setup(ItemManagerConfig.CONSTRUCTED_DECKS);
btnRandom.setText("Random Deck");

View File

@@ -1,4 +1,4 @@
package forge.gui.deckchooser;
package forge.deckchooser;
import forge.deck.CardPool;
import forge.deck.Deck;
@@ -6,14 +6,14 @@ import forge.deck.DeckSection;
import forge.game.card.Card;
import forge.gui.CardDetailPanel;
import forge.gui.CardPicturePanel;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.ItemManagerConfig;
import forge.gui.toolbox.itemmanager.ItemManagerContainer;
import forge.gui.toolbox.itemmanager.ItemManagerModel;
import forge.gui.toolbox.itemmanager.views.*;
import forge.item.PaperCard;
import forge.itemmanager.CardManager;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.ItemManagerContainer;
import forge.itemmanager.ItemManagerModel;
import forge.itemmanager.views.*;
import forge.toolbox.FButton;
import forge.toolbox.FOptionPane;
import forge.view.FDialog;
import net.miginfocom.swing.MigLayout;

View File

@@ -1,4 +1,4 @@
package forge.gui.deckchooser;
package forge.deckchooser;
public interface IDecksComboBoxListener {
public void deckTypeSelected(DecksComboBoxEvent ev);

View File

@@ -1,90 +1,92 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.download;
import forge.ImageCache;
import forge.Singletons;
import forge.card.CardRules;
import forge.item.PaperCard;
import forge.properties.NewConstants;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("serial")
public class GuiDownloadPicturesLQ extends GuiDownloader {
public GuiDownloadPicturesLQ() {
super();
}
@Override
protected final Map<String, String> getNeededImages() {
Map<String, String> downloads = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
for (PaperCard c : Singletons.getMagicDb().getCommonCards().getAllCards()) {
addDLObject(c, downloads, false);
if (ImageCache.hasBackFacePicture(c))
addDLObject(c, downloads, true);
}
for (PaperCard c : Singletons.getMagicDb().getVariantCards().getAllCards()) {
addDLObject(c, downloads, false);
}
// Add missing tokens to the list of things to download.
addMissingItems(downloads, NewConstants.IMAGE_LIST_TOKENS_FILE, NewConstants.CACHE_TOKEN_PICS_DIR);
return downloads;
}
private void addDLObject(PaperCard c, Map<String, String> downloads, boolean backFace) {
CardRules cardRules = c.getRules();
String urls = cardRules.getPictureUrl(backFace);
if (StringUtils.isEmpty(urls)) {
return;
}
String filename = ImageCache.getImageKey(c, backFace, false);
File destFile = new File(NewConstants.CACHE_CARD_PICS_DIR, filename + ".jpg");
if (destFile.exists())
return;
filename = destFile.getAbsolutePath();
if (downloads.containsKey(filename)) {
return;
}
final String urlToDownload;
int urlIndex = 0;
int allUrlsLen = 1;
if (urls.indexOf("\\") < 0)
urlToDownload = urls;
else {
String[] allUrls = urls.split("\\\\");
allUrlsLen = allUrls.length;
urlIndex = (c.getArtIndex()-1) % allUrlsLen;
urlToDownload = allUrls[urlIndex];
}
//System.out.println(c.getName() + "|" + c.getEdition() + " - " + c.getArtIndex() + " -> " + urlIndex + "/" + allUrlsLen + " === " + filename + " <<< " + urlToDownload);
downloads.put(destFile.getAbsolutePath(), urlToDownload);
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.download;
import forge.assets.ImageUtil;
import forge.card.CardRules;
import forge.item.PaperCard;
import forge.model.FModel;
import forge.properties.ForgeConstants;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("serial")
public class GuiDownloadPicturesLQ extends GuiDownloader {
public GuiDownloadPicturesLQ() {
super();
}
@Override
protected final Map<String, String> getNeededImages() {
Map<String, String> downloads = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
for (PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) {
addDLObject(c, downloads, false);
if (ImageUtil.hasBackFacePicture(c)) {
addDLObject(c, downloads, true);
}
}
for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
addDLObject(c, downloads, false);
}
// Add missing tokens to the list of things to download.
addMissingItems(downloads, ForgeConstants.IMAGE_LIST_TOKENS_FILE, ForgeConstants.CACHE_TOKEN_PICS_DIR);
return downloads;
}
private void addDLObject(PaperCard c, Map<String, String> downloads, boolean backFace) {
CardRules cardRules = c.getRules();
String urls = cardRules.getPictureUrl(backFace);
if (StringUtils.isEmpty(urls)) {
return;
}
String filename = ImageUtil.getImageKey(c, backFace, false);
File destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR, filename + ".jpg");
if (destFile.exists())
return;
filename = destFile.getAbsolutePath();
if (downloads.containsKey(filename)) {
return;
}
final String urlToDownload;
int urlIndex = 0;
int allUrlsLen = 1;
if (urls.indexOf("\\") < 0)
urlToDownload = urls;
else {
String[] allUrls = urls.split("\\\\");
allUrlsLen = allUrls.length;
urlIndex = (c.getArtIndex()-1) % allUrlsLen;
urlToDownload = allUrls[urlIndex];
}
//System.out.println(c.getName() + "|" + c.getEdition() + " - " + c.getArtIndex() + " -> " + urlIndex + "/" + allUrlsLen + " === " + filename + " <<< " + urlToDownload);
downloads.put(destFile.getAbsolutePath(), urlToDownload);
}
}

View File

@@ -1,37 +1,37 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.download;
import forge.properties.NewConstants;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("serial")
public class GuiDownloadPrices extends GuiDownloader {
public GuiDownloadPrices() {
super();
}
@Override
protected Map<String, String> getNeededImages() {
Map<String, String> result = new HashMap<String, String>();
result.put(NewConstants.QUEST_CARD_PRICE_FILE, NewConstants.URL_PRICE_DOWNLOAD);
return result;
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.download;
import forge.properties.ForgeConstants;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("serial")
public class GuiDownloadPrices extends GuiDownloader {
public GuiDownloadPrices() {
super();
}
@Override
protected Map<String, String> getNeededImages() {
Map<String, String> result = new HashMap<String, String>();
result.put(ForgeConstants.QUEST_CARD_PRICE_FILE, ForgeConstants.URL_PRICE_DOWNLOAD);
return result;
}
}

View File

@@ -15,9 +15,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.download;
package forge.download;
import forge.properties.NewConstants;
import forge.properties.ForgeConstants;
import java.util.Map;
import java.util.TreeMap;
@@ -39,20 +39,20 @@ public class GuiDownloadQuestImages extends GuiDownloader {
* getNeededCards.
* </p>
*
* @return an array of {@link forge.gui.download.GuiDownloadSetPicturesLQ} objects.
* @return an array of {@link forge.download.GuiDownloadSetPicturesLQ} objects.
*/
@Override
protected final Map<String, String> getNeededImages() {
// read all card names and urls
final Map<String, String> urls = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_OPPONENT_ICONS_FILE, NewConstants.CACHE_ICON_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_PET_SHOP_ICONS_FILE, NewConstants.CACHE_ICON_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_BOOSTERS_FILE, NewConstants.CACHE_BOOSTER_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_FATPACKS_FILE, NewConstants.CACHE_FATPACK_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_PRECONS_FILE, NewConstants.CACHE_PRECON_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE, NewConstants.CACHE_TOURNAMENTPACK_PICS_DIR);
addMissingItems(urls, NewConstants.IMAGE_LIST_QUEST_TOKENS_FILE, NewConstants.CACHE_TOKEN_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_OPPONENT_ICONS_FILE, ForgeConstants.CACHE_ICON_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_PET_SHOP_ICONS_FILE, ForgeConstants.CACHE_ICON_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERS_FILE, ForgeConstants.CACHE_BOOSTER_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_FATPACKS_FILE, ForgeConstants.CACHE_FATPACK_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_PRECONS_FILE, ForgeConstants.CACHE_PRECON_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE, ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR);
addMissingItems(urls, ForgeConstants.IMAGE_LIST_QUEST_TOKENS_FILE, ForgeConstants.CACHE_TOKEN_PICS_DIR);
return urls;
}

View File

@@ -1,68 +1,70 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.download;
import com.google.common.collect.Iterables;
import forge.ImageCache;
import forge.Singletons;
import forge.card.CardEdition;
import forge.item.PaperCard;
import forge.properties.NewConstants;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("serial")
public class GuiDownloadSetPicturesLQ extends GuiDownloader {
public GuiDownloadSetPicturesLQ() {
super();
}
@Override
protected final Map<String, String> getNeededImages() {
Map<String, String> downloads = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
for (final PaperCard c : Iterables.concat(Singletons.getMagicDb().getCommonCards().getAllCards(), Singletons.getMagicDb().getVariantCards().getAllCards())) {
final String setCode3 = c.getEdition();
if (StringUtils.isBlank(setCode3) || CardEdition.UNKNOWN.getCode().equals(setCode3)) {
// we don't want cards from unknown sets
continue;
}
addDLObject(ImageCache.getDownloadUrl(c, false), ImageCache.getImageKey(c, false, true), downloads);
if (ImageCache.hasBackFacePicture(c)) {
addDLObject(ImageCache.getDownloadUrl(c, true), ImageCache.getImageKey(c, true, true), downloads);
}
}
// Add missing tokens to the list of things to download.
addMissingItems(downloads, NewConstants.IMAGE_LIST_TOKENS_FILE, NewConstants.CACHE_TOKEN_PICS_DIR);
return downloads;
}
private void addDLObject(String urlPath, String filename, Map<String, String> downloads) {
File destFile = new File(NewConstants.CACHE_CARD_PICS_DIR, filename + ".jpg");
// System.out.println(filename);
if (!destFile.exists()) {
downloads.put(destFile.getAbsolutePath(), NewConstants.URL_PIC_DOWNLOAD + urlPath);
}
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.download;
import com.google.common.collect.Iterables;
import forge.assets.ImageUtil;
import forge.card.CardEdition;
import forge.item.PaperCard;
import forge.model.FModel;
import forge.properties.ForgeConstants;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
@SuppressWarnings("serial")
public class GuiDownloadSetPicturesLQ extends GuiDownloader {
public GuiDownloadSetPicturesLQ() {
super();
}
@Override
protected final Map<String, String> getNeededImages() {
Map<String, String> downloads = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
for (final PaperCard c : Iterables.concat(FModel.getMagicDb().getCommonCards().getAllCards(), FModel.getMagicDb().getVariantCards().getAllCards())) {
final String setCode3 = c.getEdition();
if (StringUtils.isBlank(setCode3) || CardEdition.UNKNOWN.getCode().equals(setCode3)) {
// we don't want cards from unknown sets
continue;
}
addDLObject(ImageUtil.getDownloadUrl(c, false), ImageUtil.getImageKey(c, false, true), downloads);
if (ImageUtil.hasBackFacePicture(c)) {
addDLObject(ImageUtil.getDownloadUrl(c, true), ImageUtil.getImageKey(c, true, true), downloads);
}
}
// Add missing tokens to the list of things to download.
addMissingItems(downloads, ForgeConstants.IMAGE_LIST_TOKENS_FILE, ForgeConstants.CACHE_TOKEN_PICS_DIR);
return downloads;
}
private void addDLObject(String urlPath, String filename, Map<String, String> downloads) {
File destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR, filename + ".jpg");
// System.out.println(filename);
if (!destFile.exists()) {
downloads.put(destFile.getAbsolutePath(), ForgeConstants.URL_PIC_DOWNLOAD + urlPath);
}
}
}

View File

@@ -15,22 +15,26 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.download;
package forge.download;
import com.esotericsoftware.minlog.Log;
import forge.UiCommand;
import forge.ImageCache;
import forge.assets.FSkinProp;
import forge.error.BugReporter;
import forge.gui.SOverlayUtils;
import forge.gui.toolbox.*;
import forge.toolbox.*;
import forge.util.FileUtil;
import forge.util.MyRandom;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.tuple.Pair;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -113,7 +117,7 @@ public abstract class GuiDownloader extends DefaultBoundedRangeModel implements
barProgress.reset();
barProgress.setString("Scanning for existing items...");
pnlDialog.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE));
pnlDialog.setBackgroundTexture(FSkin.getIcon(FSkinProp.BG_TEXTURE));
// Layout
pnlDialog.add(grpPanel, "w 50%!");

View File

@@ -0,0 +1,3 @@
/** Forge Card Game. */
package forge.download;

View File

@@ -1,322 +1,324 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.error;
import forge.FThreads;
import forge.gui.WrapLayout;
import forge.gui.toolbox.FHyperlink;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FOptionPane;
import forge.util.BuildInfo;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.URI;
import java.util.ArrayList;
import java.util.Map;
import java.util.Map.Entry;
/**
* The class ErrorViewer. Enables showing and saving error messages that
* occurred in forge.
*
* @author Clemens Koza
* @version V1.0 02.08.2009
*/
public class BugReporter {
private static final int _STACK_OVERFLOW_MAX_MESSAGE_LEN = 16 * 1024;
private static boolean dialogShown = false;
/**
* Shows exception information in a format ready to post to the forum as a crash report. Uses the exception's message
* as the reason if message is null.
*/
public static void reportException(final Throwable ex, final String message) {
if (ex == null) {
return;
}
if (message != null) {
System.err.printf("%s > %s%n", FThreads.debugGetCurrThreadId(), message);
}
System.err.print( FThreads.debugGetCurrThreadId() + " > " );
ex.printStackTrace();
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe what you were doing when the crash occurred]\n\n");
_buildSpoilerHeader(sb, ex.getClass().getSimpleName());
sb.append("\n\n");
if (null != message && !message.isEmpty()) {
sb.append(FThreads.debugGetCurrThreadId()).append(" > ").append(message).append("\n");
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
String swStr = sw.toString();
if (ex instanceof StackOverflowError &&
_STACK_OVERFLOW_MAX_MESSAGE_LEN <= swStr.length()) {
// most likely a cycle. only take first portion so the message
// doesn't grow too large to post
sb.append(swStr, 0, _STACK_OVERFLOW_MAX_MESSAGE_LEN);
sb.append("\n... (truncated)");
} else {
sb.append(swStr);
}
_buildSpoilerFooter(sb);
_showDialog("Report a crash", sb.toString(), true);
}
/**
* Alias for reportException(ex, null).
*/
public static void reportException(final Throwable ex) {
reportException(ex, null);
}
/**
* Alias for reportException(ex, String.format(format, args)).
*/
public static void reportException(final Throwable ex, final String format, final Object... args) {
reportException(ex, String.format(format, args));
}
/**
* Shows a forum post template for reporting a bug.
*/
public static void reportBug(String details) {
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe the problem]\n\n");
_buildSpoilerHeader(sb, "General bug report");
if (null != details && !details.isEmpty()) {
sb.append("\n\n");
sb.append(details);
}
_buildSpoilerFooter(sb);
_showDialog("Report a bug", sb.toString(), false);
}
/**
* Shows thread stack information in a format ready to post to the forum.
*/
public static void reportThreadStacks(final String message) {
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe what you were doing at the time]\n\n");
_buildSpoilerHeader(sb, "Thread stack dump");
sb.append("\n\n");
if (null != message && !message.isEmpty()) {
sb.append(message);
sb.append("\n");
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
final Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
for (final Entry<Thread, StackTraceElement[]> e : traces.entrySet()) {
pw.println();
pw.printf("%s (%s):%n", e.getKey().getName(), e.getKey().getId());
for (final StackTraceElement el : e.getValue()) {
pw.println(el);
}
}
sb.append(sw.toString());
_buildSpoilerFooter(sb);
_showDialog("Thread stack dump", sb.toString(), false);
}
/**
* Alias for reportThreadStacks(String.format(format, args))
*/
public static void reportThreadStacks(final String format, final Object... args) {
reportThreadStacks(String.format(format, args));
}
private static StringBuilder _buildSpoilerHeader(StringBuilder sb, String reportTitle) {
sb.append("[spoiler=").append(reportTitle).append("][code]");
sb.append("\nForge Version: ").append(BuildInfo.getVersionString());
sb.append("\nOperating System: ").append(System.getProperty("os.name"))
.append(" ").append(System.getProperty("os.version"))
.append(" ").append(System.getProperty("os.arch"));
sb.append("\nJava Version: ").append(System.getProperty("java.version"))
.append(" ").append(System.getProperty("java.vendor"));
return sb;
}
private static StringBuilder _buildSpoilerFooter(StringBuilder sb) {
sb.append("[/code][/spoiler]");
return sb;
}
private static void _showDialog(String title, String text, boolean showExitAppBtn) {
if ( dialogShown )
return;
JTextArea area = new JTextArea(text);
area.setFont(new Font("Monospaced", Font.PLAIN, 10));
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);
String helpText = "<html>A template for a post in the bug reports forum topic is shown below. Just select 'Copy and go to forum' "
+ "and the template will be copied to your system clipboard and the forum page will open in your browser. "
+ "Then all you have to do is paste the text into a forum post and edit the description line.</html>";
String helpUrlLabel = "Reporting bugs in Forge is very important. We sincerely thank you for your time."
+ " For help writing a solid bug report, please see:";
String helpUrl = "http://www.slightlymagic.net/forum/viewtopic.php?f=26&p=109925#p109925";
JPanel helpPanel = new JPanel(new WrapLayout(FlowLayout.LEFT, 4, 2));
for (String word : helpUrlLabel.split(" ")) {
helpPanel.add(new FLabel.Builder().text("<html>" + word + "</html>").useSkinColors(false).build());
}
helpPanel.add(new FHyperlink.Builder().url(helpUrl).text("<html>this post</html>").useSkinColors(false).build());
JPanel p = new JPanel(new MigLayout("wrap"));
p.add(new FLabel.Builder().text(helpText).useSkinColors(false).build(), "gap 5");
p.add(helpPanel, "w 600");
p.add(new JScrollPane(area), "w 100%, h 100%, gaptop 5");
// determine proper forum URL
String forgeVersion = BuildInfo.getVersionString();
final String url;
if (StringUtils.containsIgnoreCase(forgeVersion, "svn")
|| StringUtils.containsIgnoreCase(forgeVersion, "snapshot")) {
url = "http://www.slightlymagic.net/forum/viewtopic.php?f=52&t=6333&start=54564487645#bottom";
} else {
url = "http://www.slightlymagic.net/forum/viewforum.php?f=26";
}
// Button is not modified, String gets the automatic listener to hide
// the dialog
ArrayList<Object> options = new ArrayList<Object>();
options.add(new JButton(new _CopyAndGo(url, area)));
options.add(new JButton(new _SaveAction(area)));
options.add("Close");
if (showExitAppBtn) {
options.add(new JButton(new _ExitAction()));
}
JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE,
JOptionPane.DEFAULT_OPTION, null, options.toArray(), options.get(0));
JDialog dlg = pane.createDialog(JOptionPane.getRootFrame(), title);
dlg.setSize(showExitAppBtn ? 780 : 600, 400);
dlg.setResizable(true);
dialogShown = true;
dlg.setVisible(true);
dlg.dispose();
dialogShown = false;
}
@SuppressWarnings("serial")
private static class _CopyAndGo extends AbstractAction {
private final String url;
private final JTextArea text;
public _CopyAndGo(String url, JTextArea text) {
super("Copy and go to forum");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
this.url = url;
this.text = text;
}
@Override
public void actionPerformed(final ActionEvent e) {
try {
// copy text to clipboard
StringSelection ss = new StringSelection(text.getText());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
// browse to url
Desktop.getDesktop().browse(new URI(url));
}
catch (Exception ex) {
FOptionPane.showMessageDialog("Sorry, a problem occurred while opening the forum in your default browser.",
"A problem occurred", FOptionPane.ERROR_ICON);
}
}
}
@SuppressWarnings("serial")
private static class _SaveAction extends AbstractAction {
private static JFileChooser c;
private final JTextArea area;
public _SaveAction(final JTextArea areaParam) {
super("Save to file");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
this.area = areaParam;
}
@Override
public void actionPerformed(final ActionEvent e) {
if (c == null) {
c = new JFileChooser();
}
File f;
long curTime = System.currentTimeMillis();
for (int i = 0;; i++) {
final String name = String.format("%TF-%02d.txt", curTime, i);
f = new File(name);
if (!f.exists()) {
break;
}
}
c.setSelectedFile(f);
c.showSaveDialog(null);
f = c.getSelectedFile();
try {
final BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write(this.area.getText());
bw.close();
}
catch (final IOException ex) {
FOptionPane.showMessageDialog("There was an error during saving. Sorry!\n" + ex,
"Error saving file", FOptionPane.ERROR_ICON);
}
}
}
@SuppressWarnings("serial")
private static class _ExitAction extends AbstractAction {
public _ExitAction() {
super("Exit application");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
}
@Override
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
}
// disable instantiation
private BugReporter() { }
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.error;
import forge.FThreads;
import forge.gui.WrapLayout;
import forge.toolbox.FHyperlink;
import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane;
import forge.util.BuildInfo;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.URI;
import java.util.ArrayList;
import java.util.Map;
import java.util.Map.Entry;
/**
* The class ErrorViewer. Enables showing and saving error messages that
* occurred in forge.
*
* @author Clemens Koza
* @version V1.0 02.08.2009
*/
public class BugReporter {
private static final int _STACK_OVERFLOW_MAX_MESSAGE_LEN = 16 * 1024;
private static boolean dialogShown = false;
/**
* Shows exception information in a format ready to post to the forum as a crash report. Uses the exception's message
* as the reason if message is null.
*/
public static void reportException(final Throwable ex, final String message) {
if (ex == null) {
return;
}
if (message != null) {
System.err.printf("%s > %s%n", FThreads.debugGetCurrThreadId(), message);
}
System.err.print( FThreads.debugGetCurrThreadId() + " > " );
ex.printStackTrace();
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe what you were doing when the crash occurred]\n\n");
_buildSpoilerHeader(sb, ex.getClass().getSimpleName());
sb.append("\n\n");
if (null != message && !message.isEmpty()) {
sb.append(FThreads.debugGetCurrThreadId()).append(" > ").append(message).append("\n");
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
String swStr = sw.toString();
if (ex instanceof StackOverflowError &&
_STACK_OVERFLOW_MAX_MESSAGE_LEN <= swStr.length()) {
// most likely a cycle. only take first portion so the message
// doesn't grow too large to post
sb.append(swStr, 0, _STACK_OVERFLOW_MAX_MESSAGE_LEN);
sb.append("\n... (truncated)");
} else {
sb.append(swStr);
}
_buildSpoilerFooter(sb);
_showDialog("Report a crash", sb.toString(), true);
}
/**
* Alias for reportException(ex, null).
*/
public static void reportException(final Throwable ex) {
reportException(ex, null);
}
/**
* Alias for reportException(ex, String.format(format, args)).
*/
public static void reportException(final Throwable ex, final String format, final Object... args) {
reportException(ex, String.format(format, args));
}
/**
* Shows a forum post template for reporting a bug.
*/
public static void reportBug(String details) {
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe the problem]\n\n");
_buildSpoilerHeader(sb, "General bug report");
if (null != details && !details.isEmpty()) {
sb.append("\n\n");
sb.append(details);
}
_buildSpoilerFooter(sb);
_showDialog("Report a bug", sb.toString(), false);
}
/**
* Shows thread stack information in a format ready to post to the forum.
*/
public static void reportThreadStacks(final String message) {
StringBuilder sb = new StringBuilder();
sb.append("Description: [describe what you were doing at the time]\n\n");
_buildSpoilerHeader(sb, "Thread stack dump");
sb.append("\n\n");
if (null != message && !message.isEmpty()) {
sb.append(message);
sb.append("\n");
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
final Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
for (final Entry<Thread, StackTraceElement[]> e : traces.entrySet()) {
pw.println();
pw.printf("%s (%s):%n", e.getKey().getName(), e.getKey().getId());
for (final StackTraceElement el : e.getValue()) {
pw.println(el);
}
}
sb.append(sw.toString());
_buildSpoilerFooter(sb);
_showDialog("Thread stack dump", sb.toString(), false);
}
/**
* Alias for reportThreadStacks(String.format(format, args))
*/
public static void reportThreadStacks(final String format, final Object... args) {
reportThreadStacks(String.format(format, args));
}
private static StringBuilder _buildSpoilerHeader(StringBuilder sb, String reportTitle) {
sb.append("[spoiler=").append(reportTitle).append("][code]");
sb.append("\nForge Version: ").append(BuildInfo.getVersionString());
sb.append("\nOperating System: ").append(System.getProperty("os.name"))
.append(" ").append(System.getProperty("os.version"))
.append(" ").append(System.getProperty("os.arch"));
sb.append("\nJava Version: ").append(System.getProperty("java.version"))
.append(" ").append(System.getProperty("java.vendor"));
return sb;
}
private static StringBuilder _buildSpoilerFooter(StringBuilder sb) {
sb.append("[/code][/spoiler]");
return sb;
}
private static void _showDialog(String title, String text, boolean showExitAppBtn) {
if ( dialogShown )
return;
JTextArea area = new JTextArea(text);
area.setFont(new Font("Monospaced", Font.PLAIN, 10));
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);
String helpText = "<html>A template for a post in the bug reports forum topic is shown below. Just select 'Copy and go to forum' "
+ "and the template will be copied to your system clipboard and the forum page will open in your browser. "
+ "Then all you have to do is paste the text into a forum post and edit the description line.</html>";
String helpUrlLabel = "Reporting bugs in Forge is very important. We sincerely thank you for your time."
+ " For help writing a solid bug report, please see:";
String helpUrl = "http://www.slightlymagic.net/forum/viewtopic.php?f=26&p=109925#p109925";
JPanel helpPanel = new JPanel(new WrapLayout(FlowLayout.LEFT, 4, 2));
for (String word : helpUrlLabel.split(" ")) {
helpPanel.add(new FLabel.Builder().text("<html>" + word + "</html>").useSkinColors(false).build());
}
helpPanel.add(new FHyperlink.Builder().url(helpUrl).text("<html>this post</html>").useSkinColors(false).build());
JPanel p = new JPanel(new MigLayout("wrap"));
p.add(new FLabel.Builder().text(helpText).useSkinColors(false).build(), "gap 5");
p.add(helpPanel, "w 600");
p.add(new JScrollPane(area), "w 100%, h 100%, gaptop 5");
// determine proper forum URL
String forgeVersion = BuildInfo.getVersionString();
final String url;
if (StringUtils.containsIgnoreCase(forgeVersion, "svn")
|| StringUtils.containsIgnoreCase(forgeVersion, "snapshot")) {
url = "http://www.slightlymagic.net/forum/viewtopic.php?f=52&t=6333&start=54564487645#bottom";
} else {
url = "http://www.slightlymagic.net/forum/viewforum.php?f=26";
}
// Button is not modified, String gets the automatic listener to hide
// the dialog
ArrayList<Object> options = new ArrayList<Object>();
options.add(new JButton(new _CopyAndGo(url, area)));
options.add(new JButton(new _SaveAction(area)));
options.add("Close");
if (showExitAppBtn) {
options.add(new JButton(new _ExitAction()));
}
JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE,
JOptionPane.DEFAULT_OPTION, null, options.toArray(), options.get(0));
JDialog dlg = pane.createDialog(JOptionPane.getRootFrame(), title);
dlg.setSize(showExitAppBtn ? 780 : 600, 400);
dlg.setResizable(true);
dialogShown = true;
dlg.setVisible(true);
dlg.dispose();
dialogShown = false;
}
@SuppressWarnings("serial")
private static class _CopyAndGo extends AbstractAction {
private final String url;
private final JTextArea text;
public _CopyAndGo(String url, JTextArea text) {
super("Copy and go to forum");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
this.url = url;
this.text = text;
}
@Override
public void actionPerformed(final ActionEvent e) {
try {
// copy text to clipboard
StringSelection ss = new StringSelection(text.getText());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
// browse to url
Desktop.getDesktop().browse(new URI(url));
}
catch (Exception ex) {
FOptionPane.showMessageDialog("Sorry, a problem occurred while opening the forum in your default browser.",
"A problem occurred", FOptionPane.ERROR_ICON);
}
}
}
@SuppressWarnings("serial")
private static class _SaveAction extends AbstractAction {
private static JFileChooser c;
private final JTextArea area;
public _SaveAction(final JTextArea areaParam) {
super("Save to file");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
this.area = areaParam;
}
@Override
public void actionPerformed(final ActionEvent e) {
if (c == null) {
c = new JFileChooser();
}
File f;
long curTime = System.currentTimeMillis();
for (int i = 0;; i++) {
final String name = String.format("%TF-%02d.txt", curTime, i);
f = new File(name);
if (!f.exists()) {
break;
}
}
c.setSelectedFile(f);
c.showSaveDialog(null);
f = c.getSelectedFile();
try {
final BufferedWriter bw = new BufferedWriter(new FileWriter(f));
bw.write(this.area.getText());
bw.close();
}
catch (final IOException ex) {
FOptionPane.showMessageDialog("There was an error during saving. Sorry!\n" + ex,
"Error saving file", FOptionPane.ERROR_ICON);
}
}
}
@SuppressWarnings("serial")
private static class _ExitAction extends AbstractAction {
public _ExitAction() {
super("Exit application");
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
}
@Override
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
}
// disable instantiation
private BugReporter() { }
}

View File

@@ -1,3 +1,3 @@
/** Forge Card Game. */
package forge.gui.home;
/** Forge Card Game. */
package forge.error;

View File

@@ -1,50 +1,50 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.game.card.Card;
/**
* The class CardContainer. A card container is an object that references a
* card.
*
* @author Clemens Koza
* @version V0.0 17.02.2010
*/
public interface CardContainer {
/**
* <p>
* setCard.
* </p>
*
* @param card
* a {@link forge.game.card.Card} object.
*/
void setCard(Card card);
/**
* <p>
* getCard.
* </p>
*
* @return a {@link forge.game.card.Card} object.
*/
Card getCard();
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.game.card.Card;
/**
* The class CardContainer. A card container is an object that references a
* card.
*
* @author Clemens Koza
* @version V0.0 17.02.2010
*/
public interface CardContainer {
/**
* <p>
* setCard.
* </p>
*
* @param card
* a {@link forge.game.card.Card} object.
*/
void setCard(Card card);
/**
* <p>
* getCard.
* </p>
*
* @return a {@link forge.game.card.Card} object.
*/
Card getCard();
}

View File

@@ -19,15 +19,16 @@
package forge.gui;
import forge.game.card.Card;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FScrollPane;
import forge.item.PaperCard;
import forge.toolbox.FButton;
import forge.toolbox.FLabel;
import forge.toolbox.FScrollPane;
import forge.view.FDialog;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

View File

@@ -1,110 +1,111 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.ImageCache;
import forge.ImageKeys;
import forge.Singletons;
import forge.card.CardCharacteristicName;
import forge.game.card.Card;
import forge.gui.toolbox.imaging.FImagePanel;
import forge.gui.toolbox.imaging.FImagePanel.AutoSizeImageMode;
import forge.gui.toolbox.imaging.FImageUtil;
import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* Displays image associated with a card or inventory item.
*
* @version $Id$
*
*/
public final class CardPicturePanel extends JPanel {
/** Constant <code>serialVersionUID=-3160874016387273383L</code>. */
private static final long serialVersionUID = -3160874016387273383L;
private Object displayed;
private final FImagePanel panel;
private BufferedImage currentImage;
private boolean mayShowCard;
public CardPicturePanel() {
super(new BorderLayout());
this.panel = new FImagePanel();
this.add(this.panel);
}
public void setCard(final InventoryItem cp) {
this.displayed = cp;
this.mayShowCard = true;
this.setImage();
}
//@Override
public void setCard(final Card c, boolean mayShowCard) {
this.displayed = c;
this.mayShowCard = mayShowCard;
this.setImage();
}
public void setCardImage(CardCharacteristicName flipState) {
BufferedImage image = FImageUtil.getImage((Card)displayed, flipState);
if (image != null && image != this.currentImage) {
this.currentImage = image;
this.panel.setImage(image, getAutoSizeImageMode());
}
}
public void setImage() {
BufferedImage image = getImage();
if (image != null && image != this.currentImage) {
this.currentImage = image;
this.panel.setImage(image, getAutoSizeImageMode());
}
}
public BufferedImage getImage() {
if (displayed instanceof InventoryItem) {
InventoryItem item = (InventoryItem) displayed;
return ImageCache.getOriginalImage(ImageKeys.getImageKey(item, false), true);
}
else if (displayed instanceof Card) {
if (mayShowCard) {
return FImageUtil.getImage((Card)displayed);
}
return ImageCache.getOriginalImage(ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE, true);
}
return null;
}
private AutoSizeImageMode getAutoSizeImageMode() {
return (isUIScaleLarger() ? AutoSizeImageMode.PANEL : AutoSizeImageMode.SOURCE);
}
private boolean isUIScaleLarger() {
return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER);
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.ImageCache;
import forge.ImageKeys;
import forge.card.CardCharacteristicName;
import forge.game.card.Card;
import forge.item.InventoryItem;
import forge.model.FModel;
import forge.properties.ForgePreferences.FPref;
import forge.toolbox.imaging.FImagePanel;
import forge.toolbox.imaging.FImageUtil;
import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* Displays image associated with a card or inventory item.
*
* @version $Id: CardPicturePanel.java 25265 2014-03-27 02:18:47Z drdev $
*
*/
public final class CardPicturePanel extends JPanel {
/** Constant <code>serialVersionUID=-3160874016387273383L</code>. */
private static final long serialVersionUID = -3160874016387273383L;
private Object displayed;
private final FImagePanel panel;
private BufferedImage currentImage;
private boolean mayShowCard;
public CardPicturePanel() {
super(new BorderLayout());
this.panel = new FImagePanel();
this.add(this.panel);
}
public void setCard(final InventoryItem cp) {
this.displayed = cp;
this.mayShowCard = true;
this.setImage();
}
//@Override
public void setCard(final Card c, boolean mayShowCard) {
this.displayed = c;
this.mayShowCard = mayShowCard;
this.setImage();
}
public void setCardImage(CardCharacteristicName flipState) {
BufferedImage image = FImageUtil.getImage((Card)displayed, flipState);
if (image != null && image != this.currentImage) {
this.currentImage = image;
this.panel.setImage(image, getAutoSizeImageMode());
}
}
public void setImage() {
BufferedImage image = getImage();
if (image != null && image != this.currentImage) {
this.currentImage = image;
this.panel.setImage(image, getAutoSizeImageMode());
}
}
public BufferedImage getImage() {
if (displayed instanceof InventoryItem) {
InventoryItem item = (InventoryItem) displayed;
return ImageCache.getOriginalImage(ImageKeys.getImageKey(item, false), true);
}
else if (displayed instanceof Card) {
if (mayShowCard) {
return FImageUtil.getImage((Card)displayed);
}
return ImageCache.getOriginalImage(ImageKeys.TOKEN_PREFIX + ImageKeys.MORPH_IMAGE, true);
}
return null;
}
private AutoSizeImageMode getAutoSizeImageMode() {
return (isUIScaleLarger() ? AutoSizeImageMode.PANEL : AutoSizeImageMode.SOURCE);
}
private boolean isUIScaleLarger() {
return FModel.getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER);
}
}

View File

@@ -2,10 +2,10 @@ package forge.gui;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.gui.match.CMatchUI;
import forge.gui.toolbox.*;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.screens.match.CMatchUI;
import forge.toolbox.*;
import forge.view.FDialog;
import javax.swing.*;
@@ -13,6 +13,7 @@ import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

View File

@@ -1,14 +1,16 @@
package forge.gui;
import forge.control.ChatArea;
import forge.gui.toolbox.*;
import forge.gui.toolbox.FSkin.SkinnedPanel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.toolbox.*;
import forge.toolbox.FSkin.SkinnedPanel;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -46,7 +48,7 @@ public enum FNetOverlay {
if ( StringUtils.isBlank(message) )
return;
Lobby lobby = FServer.instance.getLobby();
Lobby lobby = FServer.getLobby();
lobby.speak(ChatArea.Room, lobby.getGuiPlayer(), message);
}
};

View File

@@ -1,61 +1,37 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import javax.swing.*;
@SuppressWarnings("serial")
public abstract class ForgeAction extends AbstractAction {
public static enum MatchConstants {
ALWAYSACCEPT ("Always accept this trigger"),
ALWAYSDECLINE ("Always decline this trigger"),
ALWAYSASK ("Always ask"),
HUMANEXILED ("Player's Exile", "Exile:", "Player - View Exile"),
HUMANFLASHBACK("Play card with Flashback", "Flashback:", "Player - View Cards with Flashback"),
HUMANGRAVEYARD("Player's Graveyard", "Graveyard:", "Player - View Graveyard"),
HUMANHAND ("Player's Hand", "Hand:", "Player - View Hand"),
HUMANLIBRARY ("Player's Library", "Library:", "Player - View Library");
public final String title;
public final String button;
public final String menu;
private MatchConstants(String title0) {
title = title0;
button = title0;
menu = title0;
}
private MatchConstants(String title0, String button0, String menu0) {
title = title0;
button = button0;
menu = menu0;
}
}
public ForgeAction(MatchConstants property) {
super(property.button);
this.putValue("buttonText", property.button);
this.putValue("menuText", property.menu);
}
public <T extends AbstractButton> T setupButton(final T button) {
button.setAction(this);
button.setText((String) this.getValue(button instanceof JMenuItem ? "menuText" : "buttonText"));
return button;
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import javax.swing.*;
import forge.match.MatchConstants;
@SuppressWarnings("serial")
public abstract class ForgeAction extends AbstractAction {
public ForgeAction(MatchConstants property) {
super(property.button);
this.putValue("buttonText", property.button);
this.putValue("menuText", property.menu);
}
public <T extends AbstractButton> T setupButton(final T button) {
button.setAction(this);
button.setText((String) this.getValue(button instanceof JMenuItem ? "menuText" : "buttonText"));
return button;
}
}

View File

@@ -2,17 +2,20 @@ package forge.gui;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import forge.FThreads;
import forge.Singletons;
import forge.game.card.Card;
import forge.gui.match.CMatchUI;
import forge.gui.toolbox.FOptionPane;
import forge.item.InventoryItem;
import forge.screens.match.CMatchUI;
import forge.toolbox.FOptionPane;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

View File

@@ -2,11 +2,13 @@ package forge.gui;
import forge.FThreads;
import forge.game.card.Card;
import forge.gui.match.CMatchUI;
import forge.gui.toolbox.FOptionPane;
import forge.screens.match.CMatchUI;
import forge.toolbox.FOptionPane;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

View File

@@ -1,112 +1,112 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.view.FDialog;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
/**
* <p>
* Gui_ProgressBarWindow class.
* </p>
*
* @author Forge
* @version $Id$
* @since 1.0.15
*/
public class GuiProgressBarWindow extends FDialog {
/**
*
*/
private static final long serialVersionUID = 5832740611050396643L;
private final JPanel contentPanel = new JPanel();
private final JProgressBar progressBar = new JProgressBar();
/**
* Create the dialog.
*/
public GuiProgressBarWindow() {
this.setResizable(false);
this.setTitle("Some Progress");
final Dimension screen = this.getToolkit().getScreenSize();
this.setBounds(screen.width / 3, 100, // position
450, 84); // size
this.getContentPane().setLayout(null);
this.contentPanel.setBounds(0, 0, 442, 58);
this.contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
this.getContentPane().add(this.contentPanel);
this.contentPanel.setLayout(null);
this.progressBar.setValue(50);
// progressBar.setBackground(Color.GRAY);
// progressBar.setForeground(Color.BLUE);
this.progressBar.setBounds(12, 12, 418, 32);
this.contentPanel.add(this.progressBar);
}
/**
* <p>
* setProgressRange.
* </p>
*
* @param min
* a int.
* @param max
* a int.
*/
public final void setProgressRange(final int min, final int max) {
this.progressBar.setMinimum(min);
this.progressBar.setMaximum(max);
}
/**
* <p>
* increment.
* </p>
*/
public final void increment() {
this.progressBar.setValue(this.progressBar.getValue() + 1);
if ((this.progressBar.getValue() % 10) == 0) {
this.contentPanel.paintImmediately(this.progressBar.getBounds());
}
}
/**
* Get the progressBar for fine tuning (e.g., adding text).
*
* @return the progressBar
*/
public final JProgressBar getProgressBar() {
return this.progressBar;
}
/**
* Set the progress back to zero units completed.
*
* It is not certain whether this method actually works the way it was
* intended.
*/
public final void reset() {
this.getProgressBar().setValue(0);
this.contentPanel.paintImmediately(this.getProgressBar().getBounds());
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.view.FDialog;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
/**
* <p>
* Gui_ProgressBarWindow class.
* </p>
*
* @author Forge
* @version $Id: GuiProgressBarWindow.java 24769 2014-02-09 13:56:04Z Hellfish $
* @since 1.0.15
*/
public class GuiProgressBarWindow extends FDialog {
/**
*
*/
private static final long serialVersionUID = 5832740611050396643L;
private final JPanel contentPanel = new JPanel();
private final JProgressBar progressBar = new JProgressBar();
/**
* Create the dialog.
*/
public GuiProgressBarWindow() {
this.setResizable(false);
this.setTitle("Some Progress");
final Dimension screen = this.getToolkit().getScreenSize();
this.setBounds(screen.width / 3, 100, // position
450, 84); // size
this.getContentPane().setLayout(null);
this.contentPanel.setBounds(0, 0, 442, 58);
this.contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
this.getContentPane().add(this.contentPanel);
this.contentPanel.setLayout(null);
this.progressBar.setValue(50);
// progressBar.setBackground(Color.GRAY);
// progressBar.setForeground(Color.BLUE);
this.progressBar.setBounds(12, 12, 418, 32);
this.contentPanel.add(this.progressBar);
}
/**
* <p>
* setProgressRange.
* </p>
*
* @param min
* a int.
* @param max
* a int.
*/
public final void setProgressRange(final int min, final int max) {
this.progressBar.setMinimum(min);
this.progressBar.setMaximum(max);
}
/**
* <p>
* increment.
* </p>
*/
public final void increment() {
this.progressBar.setValue(this.progressBar.getValue() + 1);
if ((this.progressBar.getValue() % 10) == 0) {
this.contentPanel.paintImmediately(this.progressBar.getBounds());
}
}
/**
* Get the progressBar for fine tuning (e.g., adding text).
*
* @return the progressBar
*/
public final JProgressBar getProgressBar() {
return this.progressBar;
}
/**
* Set the progress back to zero units completed.
*
* It is not certain whether this method actually works the way it was
* intended.
*/
public final void reset() {
this.getProgressBar().setValue(0);
this.contentPanel.paintImmediately(this.getProgressBar().getBounds());
}
}

View File

@@ -1,168 +1,169 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.game.card.Card;
import forge.gui.match.VMatchUI;
import forge.gui.match.views.VField;
import forge.view.arcane.CardPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* <p>
* GuiUtils class.
* </p>
*
* @author Forge
* @version $Id$
*/
public final class GuiUtils {
private GuiUtils() {
throw new AssertionError();
}
/**
* Attempts to create a font from a filename. Concise error reported if
* exceptions found.
*
* @param filename
* String
* @return Font
*/
public static Font newFont(final String filename) {
final File file = new File(filename);
Font ttf = null;
try {
ttf = Font.createFont(Font.TRUETYPE_FONT, file);
} catch (final FontFormatException e) {
System.err.println("GuiUtils > newFont: bad font format \"" + filename + "\"");
} catch (final IOException e) {
System.err.println("GuiUtils > newFont: can't find \"" + filename + "\"");
}
return ttf;
}
/**
* Clear all visually highlighted card panels on the battlefield.
*/
public static void clearPanelSelections() {
List<VField> view = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
for (VField v : view) {
for (CardPanel p : v.getTabletop().getCardPanels()) {
p.setSelected(false);
}
}
}
/**
* Highlight a card on the playfield.
*
* @param c
* a card to be highlighted
*/
public static void setPanelSelection(final Card c) {
mainLoop:
for (VField v : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) {
List<CardPanel> panels = v.getTabletop().getCardPanels();
for (CardPanel p : panels) {
if (p.getCard().equals(c)) {
p.setSelected(true);
break mainLoop;
}
}
}
}
private static final int minItemWidth = 100;
private static final int itemHeight = 25;
public static void setMenuItemSize(JMenuItem item) {
item.setPreferredSize(new Dimension(Math.max(item.getPreferredSize().width, minItemWidth), itemHeight));
}
public static JMenu createMenu(String label) {
if (label.startsWith("<html>")) { //adjust label if HTML
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
}
JMenu menu = new JMenu(label);
setMenuItemSize(menu);
return menu;
}
public static JMenuItem createMenuItem(String label, KeyStroke accelerator, final Runnable onClick, boolean enabled, boolean bold) {
if (label.startsWith("<html>")) { //adjust label if HTML
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
}
JMenuItem item = new JMenuItem(label);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (null != onClick) {
onClick.run();
}
}
});
item.setEnabled(enabled);
item.setAccelerator(accelerator);
if (bold) {
item.setFont(item.getFont().deriveFont(Font.BOLD));
}
setMenuItemSize(item);
return item;
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick) {
parent.add(createMenuItem(label, accelerator, onClick, true, false));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick) {
parent.add(createMenuItem(label, accelerator, onClick, true, false));
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
}
public static void addSeparator(JPopupMenu parent) {
parent.add(new JSeparator());
}
public static void addSeparator(JMenuItem parent) {
parent.add(new JSeparator());
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import forge.game.card.Card;
import forge.screens.match.VMatchUI;
import forge.screens.match.views.VField;
import forge.view.arcane.CardPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* <p>
* GuiUtils class.
* </p>
*
* @author Forge
* @version $Id: GuiUtils.java 24769 2014-02-09 13:56:04Z Hellfish $
*/
public final class GuiUtils {
private GuiUtils() {
throw new AssertionError();
}
/**
* Attempts to create a font from a filename. Concise error reported if
* exceptions found.
*
* @param filename
* String
* @return Font
*/
public static Font newFont(final String filename) {
final File file = new File(filename);
Font ttf = null;
try {
ttf = Font.createFont(Font.TRUETYPE_FONT, file);
} catch (final FontFormatException e) {
System.err.println("GuiUtils > newFont: bad font format \"" + filename + "\"");
} catch (final IOException e) {
System.err.println("GuiUtils > newFont: can't find \"" + filename + "\"");
}
return ttf;
}
/**
* Clear all visually highlighted card panels on the battlefield.
*/
public static void clearPanelSelections() {
List<VField> view = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
for (VField v : view) {
for (CardPanel p : v.getTabletop().getCardPanels()) {
p.setSelected(false);
}
}
}
/**
* Highlight a card on the playfield.
*
* @param c
* a card to be highlighted
*/
public static void setPanelSelection(final Card c) {
mainLoop:
for (VField v : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) {
List<CardPanel> panels = v.getTabletop().getCardPanels();
for (CardPanel p : panels) {
if (p.getCard().equals(c)) {
p.setSelected(true);
break mainLoop;
}
}
}
}
private static final int minItemWidth = 100;
private static final int itemHeight = 25;
public static void setMenuItemSize(JMenuItem item) {
item.setPreferredSize(new Dimension(Math.max(item.getPreferredSize().width, minItemWidth), itemHeight));
}
public static JMenu createMenu(String label) {
if (label.startsWith("<html>")) { //adjust label if HTML
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
}
JMenu menu = new JMenu(label);
setMenuItemSize(menu);
return menu;
}
public static JMenuItem createMenuItem(String label, KeyStroke accelerator, final Runnable onClick, boolean enabled, boolean bold) {
if (label.startsWith("<html>")) { //adjust label if HTML
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
}
JMenuItem item = new JMenuItem(label);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (null != onClick) {
onClick.run();
}
}
});
item.setEnabled(enabled);
item.setAccelerator(accelerator);
if (bold) {
item.setFont(item.getFont().deriveFont(Font.BOLD));
}
setMenuItemSize(item);
return item;
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick) {
parent.add(createMenuItem(label, accelerator, onClick, true, false));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick) {
parent.add(createMenuItem(label, accelerator, onClick, true, false));
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
}
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
}
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
}
public static void addSeparator(JPopupMenu parent) {
parent.add(new JSeparator());
}
public static void addSeparator(JMenuItem parent) {
parent.add(new JSeparator());
}
}

View File

@@ -1,310 +1,310 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import forge.FThreads;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FMouseAdapter;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.FScrollPane;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.List;
/**
* A simple class that shows a list of choices in a dialog. Two properties
* influence the behavior of a list chooser: minSelection and maxSelection.
* These two give the allowed number of selected items for the dialog to be
* closed. A negative value for minSelection suggests that the list is revealed
* and the choice doesn't matter.
* <ul>
* <li>If minSelection is 0, there will be a Cancel button.</li>
* <li>If minSelection is -1, 0 or 1, double-clicking a choice will also close the
* dialog.</li>
* <li>If the number of selections is out of bounds, the "OK" button is
* disabled.</li>
* <li>The dialog was "committed" if "OK" was clicked or a choice was double
* clicked.</li>
* <li>The dialog was "canceled" if "Cancel" or "X" was clicked.</li>
* <li>If the dialog was canceled, the selection will be empty.</li>
* <li>
* </ul>
*
* @param <T>
* the generic type
* @author Forge
* @version $Id$
*/
public class ListChooser<T> {
// Data and number of choices for the list
private List<T> list;
private int minChoices, maxChoices;
// Flag: was the dialog already shown?
private boolean called;
// initialized before; listeners may be added to it
private FList<T> lstChoices;
private FOptionPane optionPane;
public ListChooser(final String title, final int minChoices, final int maxChoices, final Collection<T> list, final Function<T, String> display) {
FThreads.assertExecutedByEdt(true);
this.minChoices = minChoices;
this.maxChoices = maxChoices;
this.list = list.getClass().isInstance(List.class) ? (List<T>)list : Lists.newArrayList(list);
this.lstChoices = new FList<T>(new ChooserListModel());
String[] options;
if (minChoices == 0) {
options = new String[] {"OK","Cancel"};
}
else {
options = new String[] {"OK"};
}
if (maxChoices == 1 || minChoices == -1) {
this.lstChoices.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
if (display != null) {
this.lstChoices.setCellRenderer(new TransformedCellRenderer(display));
}
FScrollPane listScroller = new FScrollPane(this.lstChoices, true);
int minWidth = this.lstChoices.getAutoSizeWidth();
if (this.lstChoices.getModel().getSize() > this.lstChoices.getVisibleRowCount()) {
minWidth += listScroller.getVerticalScrollBar().getPreferredSize().width;
}
listScroller.setMinimumSize(new Dimension(minWidth, listScroller.getMinimumSize().height));
this.optionPane = new FOptionPane(null, title, null, listScroller, options, minChoices < 0 ? 0 : -1);
this.optionPane.setButtonEnabled(0, minChoices <= 0);
if (minChoices != -1) {
this.optionPane.setDefaultFocus(this.lstChoices);
}
if (minChoices > 0) {
this.optionPane.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
}
if (minChoices != -1) {
this.lstChoices.getSelectionModel().addListSelectionListener(new SelListener());
}
this.lstChoices.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
ListChooser.this.commit();
}
}
});
this.lstChoices.addMouseListener(new FMouseAdapter() {
@Override
public void onLeftClick(MouseEvent e) {
if (e.getClickCount() == 2) {
ListChooser.this.commit();
}
}
});
}
/**
* Returns the FList used in the list chooser. this is useful for
* registering listeners before showing the dialog.
*
* @return a {@link javax.swing.JList} object.
*/
public FList<T> getLstChoices() {
return this.lstChoices;
}
/** @return boolean */
public boolean show() {
return show(list.get(0));
}
/**
* Shows the dialog and returns after the dialog was closed.
*
* @param index0 index to select when shown
* @return a boolean.
*/
public boolean show(final T item) {
if (this.called) {
throw new IllegalStateException("Already shown");
}
int result;
do {
SwingUtilities.invokeLater(new Runnable() { //invoke later so selected item not set until dialog open
@Override
public void run() {
if (list.contains(item)) {
lstChoices.setSelectedValue(item, true);
}
else {
lstChoices.setSelectedIndex(0);
}
}
});
this.optionPane.setVisible(true);
result = this.optionPane.getResult();
if (result != 0) {
this.lstChoices.clearSelection();
}
// can't stop closing by ESC, so repeat if cancelled
} while (this.minChoices > 0 && result != 0);
this.optionPane.dispose();
// this assert checks if we really don't return on a cancel if input is mandatory
assert (this.minChoices <= 0) || (result == 0);
this.called = true;
return (result == 0);
}
/**
* Returns if the dialog was closed by pressing "OK" or double clicking an
* option the last time.
*
* @return a boolean.
*/
public boolean isCommitted() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return (this.optionPane.getResult() == 0);
}
/**
* Returns the selected indices as a list of integers.
*
* @return a {@link java.util.List} object.
*/
public int[] getSelectedIndices() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedIndices();
}
/**
* Returns the selected values as a list of objects. no casts are necessary
* when retrieving the objects.
*
* @return a {@link java.util.List} object.
*/
public List<T> getSelectedValues() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedValuesList();
}
/**
* Returns the (minimum) selected index, or -1.
*
* @return a int.
*/
public int getSelectedIndex() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedIndex();
}
/**
* Returns the (first) selected value, or null.
*
* @return a T object.
*/
public T getSelectedValue() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return (T) this.lstChoices.getSelectedValue();
}
/**
* <p>
* commit.
* </p>
*/
private void commit() {
if (this.optionPane.isButtonEnabled(0)) {
optionPane.setResult(0);
}
}
private class ChooserListModel extends AbstractListModel<T> {
private static final long serialVersionUID = 3871965346333840556L;
@Override
public int getSize() {
return ListChooser.this.list.size();
}
@Override
public T getElementAt(final int index) {
return ListChooser.this.list.get(index);
}
}
private class SelListener implements ListSelectionListener {
@Override
public void valueChanged(final ListSelectionEvent e) {
final int num = ListChooser.this.lstChoices.getSelectedIndices().length;
ListChooser.this.optionPane.setButtonEnabled(0, (num >= ListChooser.this.minChoices) && (num <= ListChooser.this.maxChoices));
}
}
private class TransformedCellRenderer implements ListCellRenderer<T> {
public final Function<T, String> transformer;
public final DefaultListCellRenderer defRenderer;
/**
* TODO: Write javadoc for Constructor.
*/
public TransformedCellRenderer(final Function<T, String> t1) {
transformer = t1;
defRenderer = new DefaultListCellRenderer();
}
/* (non-Javadoc)
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(JList<? extends T> list, T value, int index, boolean isSelected, boolean cellHasFocus) {
// TODO Auto-generated method stub
return defRenderer.getListCellRendererComponent(list, transformer.apply(value), index, isSelected, cellHasFocus);
}
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import forge.FThreads;
import forge.toolbox.FList;
import forge.toolbox.FMouseAdapter;
import forge.toolbox.FOptionPane;
import forge.toolbox.FScrollPane;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.List;
/**
* A simple class that shows a list of choices in a dialog. Two properties
* influence the behavior of a list chooser: minSelection and maxSelection.
* These two give the allowed number of selected items for the dialog to be
* closed. A negative value for minSelection suggests that the list is revealed
* and the choice doesn't matter.
* <ul>
* <li>If minSelection is 0, there will be a Cancel button.</li>
* <li>If minSelection is -1, 0 or 1, double-clicking a choice will also close the
* dialog.</li>
* <li>If the number of selections is out of bounds, the "OK" button is
* disabled.</li>
* <li>The dialog was "committed" if "OK" was clicked or a choice was double
* clicked.</li>
* <li>The dialog was "canceled" if "Cancel" or "X" was clicked.</li>
* <li>If the dialog was canceled, the selection will be empty.</li>
* <li>
* </ul>
*
* @param <T>
* the generic type
* @author Forge
* @version $Id: ListChooser.java 25183 2014-03-14 23:09:45Z drdev $
*/
public class ListChooser<T> {
// Data and number of choices for the list
private List<T> list;
private int minChoices, maxChoices;
// Flag: was the dialog already shown?
private boolean called;
// initialized before; listeners may be added to it
private FList<T> lstChoices;
private FOptionPane optionPane;
public ListChooser(final String title, final int minChoices, final int maxChoices, final Collection<T> list, final Function<T, String> display) {
FThreads.assertExecutedByEdt(true);
this.minChoices = minChoices;
this.maxChoices = maxChoices;
this.list = list.getClass().isInstance(List.class) ? (List<T>)list : Lists.newArrayList(list);
this.lstChoices = new FList<T>(new ChooserListModel());
String[] options;
if (minChoices == 0) {
options = new String[] {"OK","Cancel"};
}
else {
options = new String[] {"OK"};
}
if (maxChoices == 1 || minChoices == -1) {
this.lstChoices.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
if (display != null) {
this.lstChoices.setCellRenderer(new TransformedCellRenderer(display));
}
FScrollPane listScroller = new FScrollPane(this.lstChoices, true);
int minWidth = this.lstChoices.getAutoSizeWidth();
if (this.lstChoices.getModel().getSize() > this.lstChoices.getVisibleRowCount()) {
minWidth += listScroller.getVerticalScrollBar().getPreferredSize().width;
}
listScroller.setMinimumSize(new Dimension(minWidth, listScroller.getMinimumSize().height));
this.optionPane = new FOptionPane(null, title, null, listScroller, options, minChoices < 0 ? 0 : -1);
this.optionPane.setButtonEnabled(0, minChoices <= 0);
if (minChoices != -1) {
this.optionPane.setDefaultFocus(this.lstChoices);
}
if (minChoices > 0) {
this.optionPane.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
}
if (minChoices != -1) {
this.lstChoices.getSelectionModel().addListSelectionListener(new SelListener());
}
this.lstChoices.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
ListChooser.this.commit();
}
}
});
this.lstChoices.addMouseListener(new FMouseAdapter() {
@Override
public void onLeftClick(MouseEvent e) {
if (e.getClickCount() == 2) {
ListChooser.this.commit();
}
}
});
}
/**
* Returns the FList used in the list chooser. this is useful for
* registering listeners before showing the dialog.
*
* @return a {@link javax.swing.JList} object.
*/
public FList<T> getLstChoices() {
return this.lstChoices;
}
/** @return boolean */
public boolean show() {
return show(list.get(0));
}
/**
* Shows the dialog and returns after the dialog was closed.
*
* @param index0 index to select when shown
* @return a boolean.
*/
public boolean show(final T item) {
if (this.called) {
throw new IllegalStateException("Already shown");
}
int result;
do {
SwingUtilities.invokeLater(new Runnable() { //invoke later so selected item not set until dialog open
@Override
public void run() {
if (list.contains(item)) {
lstChoices.setSelectedValue(item, true);
}
else {
lstChoices.setSelectedIndex(0);
}
}
});
this.optionPane.setVisible(true);
result = this.optionPane.getResult();
if (result != 0) {
this.lstChoices.clearSelection();
}
// can't stop closing by ESC, so repeat if cancelled
} while (this.minChoices > 0 && result != 0);
this.optionPane.dispose();
// this assert checks if we really don't return on a cancel if input is mandatory
assert (this.minChoices <= 0) || (result == 0);
this.called = true;
return (result == 0);
}
/**
* Returns if the dialog was closed by pressing "OK" or double clicking an
* option the last time.
*
* @return a boolean.
*/
public boolean isCommitted() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return (this.optionPane.getResult() == 0);
}
/**
* Returns the selected indices as a list of integers.
*
* @return a {@link java.util.List} object.
*/
public int[] getSelectedIndices() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedIndices();
}
/**
* Returns the selected values as a list of objects. no casts are necessary
* when retrieving the objects.
*
* @return a {@link java.util.List} object.
*/
public List<T> getSelectedValues() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedValuesList();
}
/**
* Returns the (minimum) selected index, or -1.
*
* @return a int.
*/
public int getSelectedIndex() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return this.lstChoices.getSelectedIndex();
}
/**
* Returns the (first) selected value, or null.
*
* @return a T object.
*/
public T getSelectedValue() {
if (!this.called) {
throw new IllegalStateException("not yet shown");
}
return (T) this.lstChoices.getSelectedValue();
}
/**
* <p>
* commit.
* </p>
*/
private void commit() {
if (this.optionPane.isButtonEnabled(0)) {
optionPane.setResult(0);
}
}
private class ChooserListModel extends AbstractListModel<T> {
private static final long serialVersionUID = 3871965346333840556L;
@Override
public int getSize() {
return ListChooser.this.list.size();
}
@Override
public T getElementAt(final int index) {
return ListChooser.this.list.get(index);
}
}
private class SelListener implements ListSelectionListener {
@Override
public void valueChanged(final ListSelectionEvent e) {
final int num = ListChooser.this.lstChoices.getSelectedIndices().length;
ListChooser.this.optionPane.setButtonEnabled(0, (num >= ListChooser.this.minChoices) && (num <= ListChooser.this.maxChoices));
}
}
private class TransformedCellRenderer implements ListCellRenderer<T> {
public final Function<T, String> transformer;
public final DefaultListCellRenderer defRenderer;
/**
* TODO: Write javadoc for Constructor.
*/
public TransformedCellRenderer(final Function<T, String> t1) {
transformer = t1;
defRenderer = new DefaultListCellRenderer();
}
/* (non-Javadoc)
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(JList<? extends T> list, T value, int index, boolean isSelected, boolean cellHasFocus) {
// TODO Auto-generated method stub
return defRenderer.getListCellRendererComponent(list, transformer.apply(value), index, isSelected, cellHasFocus);
}
}
}

View File

@@ -1,126 +1,126 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import javax.swing.*;
import java.awt.*;
/**
* A {@link JLabel} with support for multi-line text that wraps when the line
* doesn't fit in the available width. Multi-line text support is handled by the
* {@link MultiLineLabelUI}, the default UI delegate of this component. The text
* in the label can be horizontally and vertically aligned, relative to the
* bounds of the component.
*
* @author Samuel Sjoberg, http://samuelsjoberg.com
* @version 1.0.0
*/
public class MultiLineLabel extends JLabel {
/**
* Default serial version UID.
*/
private static final long serialVersionUID = 1L;
/**
* Horizontal text alignment.
*/
private int halign = SwingConstants.LEFT;
/**
* Vertical text alignment.
*/
private int valign = SwingConstants.CENTER;
/**
* Cache to save heap allocations.
*/
private Rectangle bounds;
/**
* Creates a new empty label.
*/
public MultiLineLabel() {
super();
this.setUI(MultiLineLabelUI.getLabelUI());
}
/**
* Creates a new label with <code>text</code> value.
*
* @param text
* the value of the label
*/
public MultiLineLabel(final String text) {
this();
this.setText(text);
}
/**
* {@inheritDoc}
*
* @return a {@link java.awt.Rectangle} object.
*/
@Override
public Rectangle getBounds() {
if (this.bounds == null) {
this.bounds = new Rectangle();
}
return super.getBounds(this.bounds);
}
/**
* Set the vertical text alignment.
*
* @param alignment
* vertical alignment
*/
public void setVerticalTextAlignment(final int alignment) {
this.firePropertyChange("verticalTextAlignment", this.valign, alignment);
this.valign = alignment;
}
/**
* Set the horizontal text alignment.
*
* @param alignment
* horizontal alignment
*/
public void setHorizontalTextAlignment(final int alignment) {
this.firePropertyChange("horizontalTextAlignment", this.halign, alignment);
this.halign = alignment;
}
/**
* Get the vertical text alignment.
*
* @return vertical text alignment
*/
public int getVerticalTextAlignment() {
return this.valign;
}
/**
* Get the horizontal text alignment.
*
* @return horizontal text alignment
*/
public int getHorizontalTextAlignment() {
return this.halign;
}
}
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui;
import javax.swing.*;
import java.awt.*;
/**
* A {@link JLabel} with support for multi-line text that wraps when the line
* doesn't fit in the available width. Multi-line text support is handled by the
* {@link MultiLineLabelUI}, the default UI delegate of this component. The text
* in the label can be horizontally and vertically aligned, relative to the
* bounds of the component.
*
* @author Samuel Sjoberg, http://samuelsjoberg.com
* @version 1.0.0
*/
public class MultiLineLabel extends JLabel {
/**
* Default serial version UID.
*/
private static final long serialVersionUID = 1L;
/**
* Horizontal text alignment.
*/
private int halign = SwingConstants.LEFT;
/**
* Vertical text alignment.
*/
private int valign = SwingConstants.CENTER;
/**
* Cache to save heap allocations.
*/
private Rectangle bounds;
/**
* Creates a new empty label.
*/
public MultiLineLabel() {
super();
this.setUI(MultiLineLabelUI.getLabelUI());
}
/**
* Creates a new label with <code>text</code> value.
*
* @param text
* the value of the label
*/
public MultiLineLabel(final String text) {
this();
this.setText(text);
}
/**
* {@inheritDoc}
*
* @return a {@link java.awt.Rectangle} object.
*/
@Override
public Rectangle getBounds() {
if (this.bounds == null) {
this.bounds = new Rectangle();
}
return super.getBounds(this.bounds);
}
/**
* Set the vertical text alignment.
*
* @param alignment
* vertical alignment
*/
public void setVerticalTextAlignment(final int alignment) {
this.firePropertyChange("verticalTextAlignment", this.valign, alignment);
this.valign = alignment;
}
/**
* Set the horizontal text alignment.
*
* @param alignment
* horizontal alignment
*/
public void setHorizontalTextAlignment(final int alignment) {
this.firePropertyChange("horizontalTextAlignment", this.halign, alignment);
this.halign = alignment;
}
/**
* Get the vertical text alignment.
*
* @return vertical text alignment
*/
public int getVerticalTextAlignment() {
return this.valign;
}
/**
* Get the horizontal text alignment.
*
* @return horizontal text alignment
*/
public int getHorizontalTextAlignment() {
return this.halign;
}
}

View File

@@ -1,17 +1,19 @@
package forge.gui;
import forge.Singletons;
import forge.gui.match.TargetingOverlay;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FOverlay;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinnedButton;
import forge.gui.toolbox.FSkin.SkinnedLabel;
import forge.assets.FSkinProp;
import forge.screens.match.TargetingOverlay;
import forge.toolbox.FLabel;
import forge.toolbox.FOverlay;
import forge.toolbox.FPanel;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedButton;
import forge.toolbox.FSkin.SkinnedLabel;
import net.miginfocom.swing.MigLayout;
import javax.swing.FocusManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -41,7 +43,7 @@ public final class SOverlayUtils {
pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
pnl.setBounds(new Rectangle(((w - pnlW) / 2), ((h - pnlH) / 2), pnlW, pnlH));
pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkin.InterfaceIcons.ICO_LOGO)).build(),
pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkinProp.ICO_LOGO)).build(),
"h 200px!, align center");
pnl.add(new FLabel.Builder().text("Loading new game...")
.fontSize(22).build(), "h 40px!, align center");

View File

@@ -1,16 +1,19 @@
package forge.gui.framework;
import com.google.common.collect.Lists;
import forge.Singletons;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinImage;
import forge.assets.FSkinProp;
import forge.model.FModel;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FPanel;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinImage;
import forge.view.FView;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
@@ -107,7 +110,7 @@ public final class DragCell extends JPanel implements ILocalRepaint {
* Determines visibility of tabs on game screen.
*/
private boolean showGameTabs() {
ForgePreferences prefs = Singletons.getModel().getPreferences();
ForgePreferences prefs = FModel.getPreferences();
return !prefs.getPrefBoolean(FPref.UI_HIDE_GAME_TABS);
}
@@ -437,7 +440,7 @@ public final class DragCell extends JPanel implements ILocalRepaint {
/** Paints dragging handle image the length of the label. */
private class DragHandle extends JLabel {
private final SkinImage img = FSkin.getImage(FSkin.LayoutImages.IMG_HANDLE);
private final SkinImage img = FSkin.getImage(FSkinProp.IMG_HANDLE);
private boolean hovered = false;
public DragHandle() {

View File

@@ -1,9 +1,10 @@
package forge.gui.framework;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinnedLabel;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedLabel;
import javax.swing.border.EmptyBorder;
import java.awt.*;
/**

View File

@@ -3,23 +3,23 @@
*/
package forge.gui.framework;
import forge.gui.deckeditor.views.*;
import forge.gui.home.gauntlet.VSubmenuGauntletBuild;
import forge.gui.home.gauntlet.VSubmenuGauntletContests;
import forge.gui.home.gauntlet.VSubmenuGauntletLoad;
import forge.gui.home.gauntlet.VSubmenuGauntletQuick;
import forge.gui.home.quest.*;
import forge.gui.home.sanctioned.VSubmenuConstructed;
import forge.gui.home.sanctioned.VSubmenuDraft;
import forge.gui.home.sanctioned.VSubmenuSealed;
import forge.gui.home.settings.VSubmenuAvatars;
import forge.gui.home.settings.VSubmenuDownloaders;
import forge.gui.home.settings.VSubmenuPreferences;
import forge.gui.home.settings.VSubmenuReleaseNotes;
import forge.gui.match.views.*;
import forge.gui.workshop.views.VCardDesigner;
import forge.gui.workshop.views.VCardScript;
import forge.gui.workshop.views.VWorkshopCatalog;
import forge.screens.deckeditor.views.*;
import forge.screens.home.gauntlet.VSubmenuGauntletBuild;
import forge.screens.home.gauntlet.VSubmenuGauntletContests;
import forge.screens.home.gauntlet.VSubmenuGauntletLoad;
import forge.screens.home.gauntlet.VSubmenuGauntletQuick;
import forge.screens.home.quest.*;
import forge.screens.home.sanctioned.VSubmenuConstructed;
import forge.screens.home.sanctioned.VSubmenuDraft;
import forge.screens.home.sanctioned.VSubmenuSealed;
import forge.screens.home.settings.VSubmenuAvatars;
import forge.screens.home.settings.VSubmenuDownloaders;
import forge.screens.home.settings.VSubmenuPreferences;
import forge.screens.home.settings.VSubmenuReleaseNotes;
import forge.screens.match.views.*;
import forge.screens.workshop.views.VCardDesigner;
import forge.screens.workshop.views.VCardScript;
import forge.screens.workshop.views.VWorkshopCatalog;
/**
* These are the identifiers for tabs found in the drag layout.

View File

@@ -1,21 +1,22 @@
package forge.gui.framework;
import forge.Singletons;
import forge.gui.bazaar.CBazaarUI;
import forge.gui.bazaar.VBazaarUI;
import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.VDeckEditorUI;
import forge.gui.home.CHomeUI;
import forge.gui.home.VHomeUI;
import forge.gui.match.CMatchUI;
import forge.gui.match.VMatchUI;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinImage;
import forge.gui.workshop.CWorkshopUI;
import forge.gui.workshop.VWorkshopUI;
import forge.assets.FSkinProp;
import forge.properties.FileLocation;
import forge.properties.NewConstants;
import forge.properties.ForgeConstants;
import forge.screens.bazaar.CBazaarUI;
import forge.screens.bazaar.VBazaarUI;
import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.VDeckEditorUI;
import forge.screens.home.CHomeUI;
import forge.screens.home.VHomeUI;
import forge.screens.match.CMatchUI;
import forge.screens.match.VMatchUI;
import forge.screens.workshop.CWorkshopUI;
import forge.screens.workshop.VWorkshopUI;
import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinImage;
import java.io.File;
@@ -28,7 +29,7 @@ public enum FScreen {
VHomeUI.SINGLETON_INSTANCE,
CHomeUI.SINGLETON_INSTANCE,
"Home",
FSkin.getIcon(FSkin.InterfaceIcons.ICO_FAVICON),
FSkin.getIcon(FSkinProp.ICO_FAVICON),
false,
"Exit Forge",
null),
@@ -36,103 +37,103 @@ public enum FScreen {
VMatchUI.SINGLETON_INSTANCE,
CMatchUI.SINGLETON_INSTANCE,
"Game",
FSkin.getIcon(FSkin.DockIcons.ICO_ALPHASTRIKE), //TODO: Create icon for match screen
FSkin.getIcon(FSkinProp.ICO_ALPHASTRIKE), //TODO: Create icon for match screen
true,
"Concede Game",
NewConstants.MATCH_LAYOUT_FILE),
ForgeConstants.MATCH_LAYOUT_FILE),
WORKSHOP_SCREEN(
VWorkshopUI.SINGLETON_INSTANCE,
CWorkshopUI.SINGLETON_INSTANCE,
"Workshop",
FSkin.getIcon(FSkin.DockIcons.ICO_SETTINGS), //TODO: Create icon for workshop screen
FSkin.getIcon(FSkinProp.ICO_SETTINGS), //TODO: Create icon for workshop screen
false,
"Back to Home",
NewConstants.WORKSHOP_LAYOUT_FILE),
ForgeConstants.WORKSHOP_LAYOUT_FILE),
DECK_EDITOR_CONSTRUCTED(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
false,
"Back to Home",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_ARCHENEMY(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Scheme Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_COMMANDER(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Commander Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_PLANECHASE(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Planar Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_VANGUARD(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Vanguard Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_DRAFT(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Draft Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_SEALED(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Sealed Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DECK_EDITOR_QUEST(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Quest Deck Editor",
FSkin.getImage(FSkin.EditorImages.IMG_PACK),
FSkin.getImage(FSkinProp.IMG_PACK),
true,
"Close Editor",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
QUEST_CARD_SHOP(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Spell Shop",
FSkin.getIcon(FSkin.QuestIcons.ICO_BOOK),
FSkin.getIcon(FSkinProp.ICO_QUEST_BOOK),
true,
"Leave Shop",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
DRAFTING_PROCESS(
VDeckEditorUI.SINGLETON_INSTANCE,
CDeckEditorUI.SINGLETON_INSTANCE,
"Draft",
FSkin.getImage(FSkin.ZoneImages.IMG_HAND),
FSkin.getImage(FSkinProp.IMG_ZONE_HAND),
true,
"Leave Draft",
NewConstants.EDITOR_LAYOUT_FILE),
ForgeConstants.EDITOR_LAYOUT_FILE),
QUEST_BAZAAR(
VBazaarUI.SINGLETON_INSTANCE,
CBazaarUI.SINGLETON_INSTANCE,
"Bazaar",
FSkin.getIcon(FSkin.QuestIcons.ICO_BOTTLES),
FSkin.getIcon(FSkinProp.ICO_QUEST_BOTTLES),
true,
"Leave Bazaar",
null);

View File

@@ -1,9 +1,9 @@
package forge.gui.framework;
import forge.Singletons;
import forge.gui.toolbox.FAbsolutePositioner;
import forge.properties.FileLocation;
import forge.properties.NewConstants;
import forge.properties.ForgeConstants;
import forge.toolbox.FAbsolutePositioner;
import forge.util.CollectionSuppliers;
import forge.util.ThreadUtil;
import forge.util.maps.HashMapOfLists;
@@ -16,6 +16,7 @@ import javax.xml.stream.*;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.awt.*;
import java.io.*;
import java.util.Collection;
@@ -65,7 +66,7 @@ public final class SLayoutIO {
final Rectangle normalBounds = window.getNormalBounds();
final FileLocation file = NewConstants.WINDOW_LAYOUT_FILE;
final FileLocation file = ForgeConstants.WINDOW_LAYOUT_FILE;
final String fWriteTo = file.userPrefLoc;
final XMLOutputFactory out = XMLOutputFactory.newInstance();
FileOutputStream fos = null;
@@ -105,7 +106,7 @@ public final class SLayoutIO {
public static void loadWindowLayout() {
final FFrame window = FView.SINGLETON_INSTANCE.getFrame();
final XMLInputFactory inputFactory = XMLInputFactory.newInstance();
final FileLocation file = NewConstants.WINDOW_LAYOUT_FILE;
final FileLocation file = ForgeConstants.WINDOW_LAYOUT_FILE;
boolean usedCustomPrefsFile = false;
FileInputStream fis = null;
try {

View File

@@ -1,9 +1,10 @@
package forge.gui.framework;
import forge.assets.FSkinProp;
import forge.gui.MouseUtil;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinCursor;
import forge.gui.toolbox.FSkin.SkinnedLayeredPane;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinCursor;
import forge.toolbox.FSkin.SkinnedLayeredPane;
import forge.view.FView;
import javax.swing.*;
@@ -47,11 +48,11 @@ public final class SRearrangingUtil {
private static List<IVDoc<? extends ICDoc>> docsToMove = new ArrayList<IVDoc<? extends ICDoc>>();
private static IVDoc<? extends ICDoc> srcSelectedDoc = null;
private static final SkinCursor CUR_L = FSkin.getCursor(FSkin.LayoutImages.IMG_CUR_L, 16, 16, "CUR_L");
private static final SkinCursor CUR_T = FSkin.getCursor(FSkin.LayoutImages.IMG_CUR_T, 16, 16, "CUR_T");
private static final SkinCursor CUR_B = FSkin.getCursor(FSkin.LayoutImages.IMG_CUR_B, 16, 16, "CUR_B");
private static final SkinCursor CUR_R = FSkin.getCursor(FSkin.LayoutImages.IMG_CUR_R, 16, 16, "CUR_R");
private static final SkinCursor CUR_TAB = FSkin.getCursor(FSkin.LayoutImages.IMG_CUR_TAB, 16, 16, "CUR_TAB");
private static final SkinCursor CUR_L = FSkin.getCursor(FSkinProp.IMG_CUR_L, 16, 16, "CUR_L");
private static final SkinCursor CUR_T = FSkin.getCursor(FSkinProp.IMG_CUR_T, 16, 16, "CUR_T");
private static final SkinCursor CUR_B = FSkin.getCursor(FSkinProp.IMG_CUR_B, 16, 16, "CUR_B");
private static final SkinCursor CUR_R = FSkin.getCursor(FSkinProp.IMG_CUR_R, 16, 16, "CUR_R");
private static final SkinCursor CUR_TAB = FSkin.getCursor(FSkinProp.IMG_CUR_TAB, 16, 16, "CUR_TAB");
private static final MouseListener MAD_REARRANGE = new MouseAdapter() {
@Override

View File

@@ -2,8 +2,8 @@ package forge.gui.framework;
import forge.gui.FNetOverlay;
import forge.gui.MouseUtil;
import forge.gui.toolbox.FAbsolutePositioner;
import forge.gui.toolbox.FOverlay;
import forge.toolbox.FAbsolutePositioner;
import forge.toolbox.FOverlay;
import forge.view.FDialog;
import forge.view.FFrame;
import forge.view.FNavigationBar;

View File

@@ -1,3 +1,3 @@
/** Forge Card Game. */
package forge.gui.framework;
/** Forge Card Game. */
package forge.gui.framework;

View File

@@ -1,3 +1,3 @@
/** Forge Card Game. */
package forge.gui;
/** Forge Card Game. */
package forge.gui;

View File

@@ -1,14 +1,15 @@
package forge.gui.toolbox.itemmanager;
package forge.itemmanager;
import forge.Singletons;
import forge.game.GameFormat;
import forge.gui.GuiUtils;
import forge.gui.home.quest.DialogChooseSets;
import forge.gui.toolbox.itemmanager.filters.*;
import forge.item.PaperCard;
import forge.itemmanager.filters.*;
import forge.model.FModel;
import forge.quest.QuestWorld;
import forge.screens.home.quest.DialogChooseSets;
import javax.swing.*;
import java.util.List;
/**
@@ -52,7 +53,7 @@ public class CardManager extends ItemManager<PaperCard> {
GuiUtils.addSeparator(menu); //separate from current search item
JMenu fmt = GuiUtils.createMenu("Format");
for (final GameFormat f : Singletons.getModel().getFormats()) {
for (final GameFormat f : FModel.getFormats()) {
GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() {
@Override
public void run() {
@@ -85,7 +86,7 @@ public class CardManager extends ItemManager<PaperCard> {
});
JMenu world = GuiUtils.createMenu("Quest world");
for (final QuestWorld w : Singletons.getModel().getWorlds()) {
for (final QuestWorld w : FModel.getWorlds()) {
GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() {
@Override
public void run() {

View File

@@ -1,26 +1,31 @@
package forge.gui.toolbox.itemmanager;
package forge.itemmanager;
import forge.UiCommand;
import forge.Singletons;
import forge.assets.FSkinProp;
import forge.deck.DeckBase;
import forge.deck.io.DeckPreferences;
import forge.game.GameFormat;
import forge.game.GameType;
import forge.gui.GuiUtils;
import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.DeckProxy;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.controllers.ACEditorBase;
import forge.gui.deckeditor.controllers.CEditorLimited;
import forge.gui.deckeditor.controllers.CEditorQuest;
import forge.deck.DeckProxy;
import forge.gui.framework.FScreen;
import forge.gui.home.quest.DialogChooseSets;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.filters.*;
import forge.gui.toolbox.itemmanager.views.*;
import forge.item.InventoryItem;
import forge.itemmanager.ColumnDef;
import forge.itemmanager.ItemColumn;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.filters.*;
import forge.itemmanager.views.*;
import forge.model.FModel;
import forge.quest.QuestWorld;
import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.SEditorIO;
import forge.screens.deckeditor.controllers.ACEditorBase;
import forge.screens.deckeditor.controllers.CEditorLimited;
import forge.screens.deckeditor.controllers.CEditorQuest;
import forge.screens.home.quest.DialogChooseSets;
import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin;
import org.apache.commons.lang3.StringUtils;
@@ -43,10 +48,10 @@ import java.util.Set;
*/
@SuppressWarnings("serial")
public final class DeckManager extends ItemManager<DeckProxy> {
private static final FSkin.SkinIcon icoDelete = FSkin.getIcon(FSkin.InterfaceIcons.ICO_DELETE);
private static final FSkin.SkinIcon icoDeleteOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_DELETE_OVER);
private static final FSkin.SkinIcon icoEdit = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT);
private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkin.InterfaceIcons.ICO_EDIT_OVER);
private static final FSkin.SkinIcon icoDelete = FSkin.getIcon(FSkinProp.ICO_DELETE);
private static final FSkin.SkinIcon icoDeleteOver = FSkin.getIcon(FSkinProp.ICO_DELETE_OVER);
private static final FSkin.SkinIcon icoEdit = FSkin.getIcon(FSkinProp.ICO_EDIT);
private static final FSkin.SkinIcon icoEditOver = FSkin.getIcon(FSkinProp.ICO_EDIT_OVER);
private final GameType gametype;
private UiCommand cmdDelete, cmdSelect;
@@ -83,11 +88,11 @@ public final class DeckManager extends ItemManager<DeckProxy> {
boolean wasStringOnly = (this.getConfig() == ItemManagerConfig.STRING_ONLY);
boolean isStringOnly = (config0 == ItemManagerConfig.STRING_ONLY);
Map<ColumnDef, ItemColumn> colOverrides = null;
Map<ColumnDef, ItemTableColumn> colOverrides = null;
if (config0.getCols().containsKey(ColumnDef.DECK_ACTIONS)) {
ItemColumn column = new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS));
ItemTableColumn column = new ItemTableColumn(new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS)));
column.setCellRenderer(new DeckActionsRenderer());
colOverrides = new HashMap<ColumnDef, ItemColumn>();
colOverrides = new HashMap<ColumnDef, ItemTableColumn>();
colOverrides.put(ColumnDef.DECK_ACTIONS, column);
}
super.setup(config0, colOverrides);
@@ -155,7 +160,7 @@ public final class DeckManager extends ItemManager<DeckProxy> {
menu.add(folder);
JMenu fmt = GuiUtils.createMenu("Format");
for (final GameFormat f : Singletons.getModel().getFormats()) {
for (final GameFormat f : FModel.getFormats()) {
GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() {
@Override
public void run() {
@@ -188,7 +193,7 @@ public final class DeckManager extends ItemManager<DeckProxy> {
});
JMenu world = GuiUtils.createMenu("Quest world");
for (final QuestWorld w : Singletons.getModel().getWorlds()) {
for (final QuestWorld w : FModel.getWorlds()) {
GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() {
@Override
public void run() {
@@ -217,7 +222,7 @@ public final class DeckManager extends ItemManager<DeckProxy> {
switch (this.gametype) {
case Quest:
screen = FScreen.DECK_EDITOR_QUEST;
editorCtrl = new CEditorQuest(Singletons.getModel().getQuest());
editorCtrl = new CEditorQuest(FModel.getQuest());
break;
case Constructed:
screen = FScreen.DECK_EDITOR_CONSTRUCTED;
@@ -226,11 +231,11 @@ public final class DeckManager extends ItemManager<DeckProxy> {
break;
case Sealed:
screen = FScreen.DECK_EDITOR_SEALED;
editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getSealed(), screen);
editorCtrl = new CEditorLimited(FModel.getDecks().getSealed(), screen);
break;
case Draft:
screen = FScreen.DECK_EDITOR_DRAFT;
editorCtrl = new CEditorLimited(Singletons.getModel().getDecks().getDraft(), screen);
editorCtrl = new CEditorLimited(FModel.getDecks().getDraft(), screen);
break;
default:
@@ -266,7 +271,7 @@ public final class DeckManager extends ItemManager<DeckProxy> {
break;
case Quest:
deck.deleteFromStorage();
Singletons.getModel().getQuest().save();
FModel.getQuest().save();
break;
default:
throw new UnsupportedOperationException("Delete not implemneted for game type = " + gametype.toString());

View File

@@ -15,22 +15,27 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox.itemmanager;
package forge.itemmanager;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.UiCommand;
import forge.assets.FSkinProp;
import forge.gui.GuiUtils;
import forge.gui.toolbox.*;
import forge.gui.toolbox.FSkin.Colors;
import forge.gui.toolbox.FSkin.SkinIcon;
import forge.gui.toolbox.FSkin.SkinnedCheckBox;
import forge.gui.toolbox.FSkin.SkinnedPanel;
import forge.gui.toolbox.itemmanager.filters.ItemFilter;
import forge.gui.toolbox.itemmanager.views.*;
import forge.item.InventoryItem;
import forge.itemmanager.ColumnDef;
import forge.itemmanager.IItemManager;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.ItemManagerModel;
import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.views.*;
import forge.toolbox.*;
import forge.toolbox.FSkin.Colors;
import forge.toolbox.FSkin.SkinIcon;
import forge.toolbox.FSkin.SkinnedCheckBox;
import forge.toolbox.FSkin.SkinnedPanel;
import forge.util.Aggregates;
import forge.util.ItemPool;
import forge.util.ReflectionUtil;
@@ -55,7 +60,7 @@ import java.util.Map.Entry;
* the generic type
*/
@SuppressWarnings("serial")
public abstract class ItemManager<T extends InventoryItem> extends JPanel {
public abstract class ItemManager<T extends InventoryItem> extends JPanel implements IItemManager<T> {
private ItemPool<T> pool;
private final ItemManagerModel<T> model;
private Predicate<? super T> filterPredicate = null;
@@ -99,7 +104,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
.fontSize(12)
.build();
private static final SkinIcon VIEW_OPTIONS_ICON = FSkin.getIcon(FSkin.DockIcons.ICO_SETTINGS).resize(20, 20);
private static final SkinIcon VIEW_OPTIONS_ICON = FSkin.getIcon(FSkinProp.ICO_SETTINGS).resize(20, 20);
private final FLabel btnViewOptions = new FLabel.Builder()
.hoverable().selectable(true)
.icon(VIEW_OPTIONS_ICON).iconScaleAuto(false)
@@ -297,7 +302,7 @@ public abstract class ItemManager<T extends InventoryItem> extends JPanel {
public void setup(ItemManagerConfig config0) {
this.setup(config0, null);
}
public void setup(ItemManagerConfig config0, Map<ColumnDef, ItemColumn> colOverrides) {
public void setup(ItemManagerConfig config0, Map<ColumnDef, ItemTableColumn> colOverrides) {
this.config = config0;
this.setWantUnique(config0.getUniqueCardsOnly());
for (ItemView<T> view : this.views) {

View File

@@ -15,9 +15,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox.itemmanager;
package forge.itemmanager;
import forge.gui.toolbox.FSkin.SkinnedScrollPane;
import forge.toolbox.FSkin.SkinnedScrollPane;
import javax.swing.*;
import javax.swing.border.Border;

View File

@@ -1,7 +1,7 @@
package forge.gui.toolbox.itemmanager;
package forge.itemmanager;
import forge.gui.toolbox.itemmanager.filters.ItemFilter;
import forge.item.InventoryItem;
import forge.itemmanager.filters.ItemFilter;
import javax.swing.*;

View File

@@ -1,15 +1,16 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.card.CardRules;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.SItemManagerUtil.StatTypes;
import forge.gui.toolbox.itemmanager.SpellShopManager;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SpellShopManager;
import forge.itemmanager.SItemManagerUtil.StatTypes;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
@@ -45,8 +46,8 @@ public class CardCMCFilter extends StatTypeFilter<PaperCard> {
protected final Predicate<PaperCard> buildPredicate() {
final List<Predicate<CardRules>> cmcs = new ArrayList<Predicate<CardRules>>();
for (SItemManagerUtil.StatTypes s : buttonMap.keySet()) {
if (s.predicate != null && buttonMap.get(s).getSelected()) {
for (StatTypes s : buttonMap.keySet()) {
if (s.predicate != null && buttonMap.get(s).isSelected()) {
cmcs.add(s.predicate);
}
}

View File

@@ -1,11 +1,12 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
/**
* TODO: Write javadoc for this type.

View File

@@ -1,18 +1,16 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.gui.toolbox.itemmanager.SItemManagerUtil.StatTypes;
import forge.gui.toolbox.itemmanager.SpellShopManager;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SFilterUtil;
import forge.itemmanager.SpellShopManager;
import forge.itemmanager.SItemManagerUtil.StatTypes;
import javax.swing.*;
/**
* TODO: Write javadoc for this type.
*
*/
public class CardColorFilter extends StatTypeFilter<PaperCard> {
public CardColorFilter(ItemManager<? super PaperCard> itemManager0) {
super(itemManager0);

View File

@@ -1,15 +1,13 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.item.PaperCard;
/**
* TODO: Write javadoc for this type.
*
*/
import forge.game.GameFormat;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SFilterUtil;
public class CardFormatFilter extends FormatFilter<PaperCard> {
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0) {
super(itemManager0);

View File

@@ -1,11 +1,12 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
/**
* TODO: Write javadoc for this type.

View File

@@ -1,18 +1,15 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import forge.Singletons;
import forge.game.GameFormat;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.model.FModel;
import forge.quest.QuestWorld;
import java.util.HashSet;
import java.util.Set;
/**
* TODO: Write javadoc for this type.
*
*/
public class CardQuestWorldFilter extends CardFormatFilter {
private final Set<QuestWorld> questWorlds = new HashSet<QuestWorld>();
@@ -42,7 +39,7 @@ public class CardQuestWorldFilter extends CardFormatFilter {
}
public static boolean canAddQuestWorld(QuestWorld questWorld, ItemFilter<PaperCard> existingFilter) {
if (questWorld.getFormat() == null && Singletons.getModel().getQuest().getMainFormat() == null) {
if (questWorld.getFormat() == null && FModel.getQuest().getMainFormat() == null) {
return false; //must have format
}
return existingFilter == null || !((CardQuestWorldFilter)existingFilter).questWorlds.contains(questWorld);
@@ -86,7 +83,7 @@ public class CardQuestWorldFilter extends CardFormatFilter {
GameFormat format = w.getFormat();
if (format == null) {
//assumes that no world other than the main world will have a null format
format = Singletons.getModel().getQuest().getMainFormat();
format = FModel.getQuest().getMainFormat();
}
return format;
}

View File

@@ -1,24 +1,23 @@
package forge.gui.toolbox.itemmanager.filters;
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import forge.UiCommand;
import forge.gui.toolbox.FComboBoxWrapper;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FTextField;
import forge.gui.toolbox.LayoutHelper;
import forge.gui.toolbox.itemmanager.ItemManager;
import forge.gui.toolbox.itemmanager.SFilterUtil;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SFilterUtil;
import forge.toolbox.FComboBoxWrapper;
import forge.toolbox.FLabel;
import forge.toolbox.FTextField;
import forge.toolbox.LayoutHelper;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
* TODO: Write javadoc for this type.
*
*/
public class CardSearchFilter extends TextSearchFilter<PaperCard> {
private FComboBoxWrapper<String> cbSearchMode;
private FLabel btnName, btnType, btnText;
@@ -33,9 +32,9 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
copy.getWidget(); //initialize widget
copy.txtSearch.setText(this.txtSearch.getText());
copy.cbSearchMode.setSelectedIndex(this.cbSearchMode.getSelectedIndex());
copy.btnName.setSelected(this.btnName.getSelected());
copy.btnType.setSelected(this.btnType.getSelected());
copy.btnText.setSelected(this.btnText.getSelected());
copy.btnName.setSelected(this.btnName.isSelected());
copy.btnType.setSelected(this.btnType.isSelected());
copy.btnText.setSelected(this.btnText.isSelected());
return copy;
}
@@ -102,15 +101,15 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
return SFilterUtil.buildTextFilter(
txtSearch.getText(),
cbSearchMode.getSelectedIndex() != 0,
btnName.getSelected(),
btnType.getSelected(),
btnText.getSelected());
btnName.isSelected(),
btnType.isSelected(),
btnText.isSelected());
}
@Override
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
//fallback to regular item text filter if item not PaperCard
boolean result = btnName.getSelected() && SFilterUtil.buildItemTextFilter(txtSearch.getText()).apply(item);
boolean result = btnName.isSelected() && SFilterUtil.buildItemTextFilter(txtSearch.getText()).apply(item);
if (cbSearchMode.getSelectedIndex() != 0) { //invert result if needed
result = !result;
}

Some files were not shown because too many files have changed in this diff Show More