public void save(boolean isPublic) {
		// Custom added mods are handled differently from mods already in the spreadsheet
        StringBuilder bldr = new StringBuilder();
		if(name.getText().equals("") || name.getText().equals("Unknown")) {
            bldr.append("Can't save a mod without a name\n");
		}
		if(author.getText().equals("") || author.getText().equals("Unknown")) {
            bldr.append("Can't save a mod without an author\n");
		}
		if(link.getText().equals("") || link.getText().equals("None")) {
            bldr.append("Can't save a mod without a link\n");
		}
        if(!bldr.toString().equals("")) {
            JOptionPane.showMessageDialog(Globals.getInstance().mainFrame,
                    bldr.toString());
            return;
        }

        String result;
        if(shortName.getText().equals("")) {
            result = ModPack.generateShortName(name.getText()).toLowerCase();
            shortName.setText(result);
        } else {
            result = shortName.getText();
        }

        ModInfo tempInfo = new ModInfo(result);

		tempInfo.officialSpreadsheet = false;

		tempInfo.modName = name.getText();
		tempInfo.modAuthor = author.getText();
		tempInfo.modLink = link.getText();
		tempInfo.licenseLink = licensePermissionLink.getText();
		tempInfo.licenseImage = licenseImageLink.getText();

		tempInfo.publicPolicy = publicPermType.getType();

		tempInfo.customLink = customLink.getText();
		tempInfo.isPublicPerm = isPublic;

		Globals.getModPack().addModInfo(getShortName(), tempInfo);
		
		updateEditableCustom();
		
		notifySaveListeners(tempInfo);
		
		Globals.getInstance().rebuildsMods.recheckMods();
	}